2016-08-11 4 views
0

Ich schreibe eine Funktion, die eine Textdatei nur einmal aktualisieren kann, aber ich muss es wiederholt tun. Um zu vermeiden, dass eine temporäre Datei häufig in eine Zieldatei kopiert wird, möchte ich alle Wörter in einer Schleife nur einmal aktualisieren. Wie kann ich das tun? Hier ist mein Python-Code (aber nur einmal aktualisieren):Wie aktualisiert man eine Textdatei in einer Schleife in Python

import io 
from tempfile import mkstemp 
from shutil import move 
from os import remove, close 

def replaceWords(source_file_path, old_word, cluster_labels): 

    new_word_list = [old_word + "_" + str(label) for label in cluster_labels] 
    fh, target_file_path = mkstemp() 

    with io.open(target_file_path, mode='w', encoding='utf8') as target_file: 
     with io.open(source_file_path, mode='r', encoding='utf8') as source_file: 
      index = 0 
      for line in source_file: 
       words =[] 
       for word in line.split(): 
        if word == old_word: 
         words.append(word.replace(old_word, new_word_list[index])) 
         index += 1 
        else: 
         words.append(word) 
       target_file.write(" ".join(words)) 

    close(fh) 
    remove(source_file_path) 
    move(target_file_path, source_file_path) 

zum Beispiel:

zum ersten Update:

Quelldatei Kontexte: of anarchism have often been divided into the categories of social and individualist anarchism or similar dual classifications

old_word: 'von'

cluster_labels: '[1, 2]'

nach Update: Zieldatei Kontexte: of_1 anarchism have often been divided into the categories of_2 social and individualist anarchism or similar dual classifications

zum zweiten Update:

old_word: 'Anarchismus'

cluster_labels: '[1, 2]'

nach Update:

Zieldateikontexte: of_1 anarchism_1 have often been divided into the categories of_2 social and individualist anarchism_2 or similar dual classifications

In meinem Code muss ich die Funktion zweimal aufrufen und die Datei zweimal kopieren, aber wenn die Wörter, die aktualisiert werden müssen, zu viele sind, ist diese Methode definitiv zeitaufwendig und häufiges Lesen/Schreiben/Kopieren, was unfreundlich ist.

Gibt es also irgendeine Methode, die elegant damit umgehen kann, ohne häufig zu lesen/schreiben/kopieren?

Antwort

0

Es kann viele Wege geben, dies zu tun. 1 des Ansatzes inline zu dem, was Sie getan haben, kann sein, um * argv zu verwenden, um die Liste der zu ersetzenden Wörter zu erhalten und die Wörter in derselben Zeile zu ersetzen, wie Sie aktuell tun. Ich füge hier etwas Pseudo-Code hinzu, es wird nicht auf die Fehler getestet. Bitte beachten Sie 2 Änderungen 1. im Eingabeparameter der Funktion. 2. Die for-Schleife hinzugefügt, um den Eingabeparameter zu durchlaufen.

#! /usr/bin/python 

import io 
from tempfile import mkstemp 
from shutil import move 
from os import remove, close 
import logging 
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s -%(levelname)s - %(message)s') 

def replaceWords(**source_file_path, cluster_labels ,*argv**): 
    old_word = 'of' 
    new_word_list = [old_word + "_" + str(label) for label in cluster_labels] 
    fh, target_file_path = mkstemp() 
    logging.debug(new_word_list) 
    logging.debug(old_word) 

    with io.open(target_file_path, mode='w', encoding='utf8') as target_file: 
     with io.open(source_file_path, mode='r', encoding='utf8') as source_file: 
      index = 0 
      for line in source_file: 
       words =[] 
       for word in line.split(): 
         **for wordtochange in argv:** 
           if word == old_word: 
             words.append(word.replace(old_word, new_word_list[index])) 
             index += 1 
           else: 
             words.append(word) 
       target_file.write(" ".join(words)) 

    close(fh) 
    remove(source_file_path) 
    move(target_file_path, source_file_path) 

replaceWords('file.txt',[1,2],('of','anarchism')) 
Verwandte Themen