2017-02-14 4 views
2

Ich habe ein Skript geschrieben, um überflüssige Leerzeichen aus einem fremdsprachigen Text zu entfernen. Wenn ich das Skript in Windows-Eingabeaufforderung ausführe, erhalte ich keine Fehler. Alles sieht perfekt aus. Die Ausgabedatei, die ich in meinem Skript angegeben habe, wird jedoch weder erstellt noch die Eingabedatei geändert. Ich habe versucht, ein leeres Dokument 'corpus_1' für das Skript zu schreiben. Dann habe ich versucht, einfach zurück in die Eingabedatei zu schreiben. In beiden Fällen bleibt die angegebene Datei unverändert. Wie kann ich mein Skript in eine Datei schreiben lassen? Was fehlt mir in meinem Code?Warum schreibt mein Skript nicht in die Datei?

def lettersWhitespace(): 

    replacements = {' ':' ', 'c ':'c'} 

    with open('C:\\Users\\Charles\\corpus.odt','w+') as infile, open('C:\\Users\\Charles\\corpus_1.odt', 'w') as outfile: 
     for line in infile: 
      for src, target in replacements.iteritems(): 
       line = line.replace(src, target) 
      outfile.write(line) 

EDIT: Ich glaube, dass ich das Problem gefunden habe. Es scheint, dass meine erste Zeile "def lettersWhitespace():" überflüssig ist. Wie geschrieben, definiert das Skript eine Funktion, ruft diese Funktion jedoch nicht auf. Klingt das richtig?

+0

'w +' löscht die Datei. Ich hoffe, das war nicht deine einzige Kopie. – user2357112

+0

Danke für die Eingabe. Ich habe mehrere Backups, aber nach dem Ausführen des Skripts habe ich nicht einmal eine gelöschte Datei erstellt. Nichts wird verändert. Aber wenn ich das endlich zur Arbeit bekomme, sollte ich einfach 'w' anstatt 'w +' haben? –

Antwort

1

Sowohl w als auch w+ die Datei abschneiden. Angenommen, Sie haben eine Datei mit a, b, c (jeweils in einer neuen Zeile):

with open('testfile.txt', 'w') as f: 
    f.write('a\nb\nc') 

und öffnen Sie es in r Sie die Datei lesen können:

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# a 
# b 
# c 

Wenn Sie es in w+ öffnen Modus es ist abgeschnitten (leer):

with open('testfile.txt', 'w+') as f: 
    print(f.read()) 
# 

Sie wollten wahrscheinlich einen "nicht-Abschneiden" Lese-/Schreibmodus Stern ting an der Datei Anfang: r+ (oder wenn Sie die Datei-Handle sein am Ende der Datei wollen: a+)

with open('testfile.txt', 'r+') as outp, open('testfile.txt', 'r') as inp: 
    for line in inp: 
     line = line.replace('a', 'b') 
     outp.write(line) 

, die die Datei ändert, wie Sie schreiben:

with open('testfile.txt', 'r') as f: 
    print(f.read()) 
# b 
# b 
# c 

Eine sehr praktische Zusammenfassung der Dateimodi finden Sie in this StackOverflow answer of @And.

+0

Danke. Ich bin ein Neuling und habe 'w' als 'schreiben', 'r' als 'lesen', 'a' als 'anhängen' und '+' als 'lesen und schreiben' verstanden. Es fängt an, so auszusehen, als ob es ein bisschen mehr auf dem Bild gäbe, also werde ich mir noch ein paar Tutorials zu den Befehlen zum Öffnen von Dateien ansehen. Für das betreffende Skript scheint es, dass dies der Grund ist, dass mein Quelltext nicht verändert wird? Ich habe mich auch gefragt, ob Python Schwierigkeiten hat, mit Text zu arbeiten, der nicht in .txt-Dateien enthalten ist. (Ich verwende derzeit .odt-Dateien als meine Eingabe und Ausgabe.) –

+0

@CharlesR In Windows gibt es einen Unterschied zwischen Binärdateien und Rohdatendateien, es könnte notwendig sein, Dateien im 'b'-Modus zu öffnen (fügen Sie einfach' 'hinzu b) irgendwo im Modus wie 'rb +'. Nicht sicher, ob '.odt'-Dateien Binärdateien sind. Auch bin ich ein bisschen verwirrt. Hat es funktioniert? Beachten Sie, dass, wenn diese Anser Ihre Frage vollständig beantworten, bitte nicht vergessen (akzeptiere es) (http://stackoverflow.com/help/accepted-answer) – MSeifert

+0

Ich habe immer noch keinen Weg gefunden, es zum Laufen zu bringen.Ich habe gerade versucht, den Modus auf rb + zu ändern Eine .txt-Datei für Testzwecke. Zusätzlich habe ich versucht, die geschachtelte 'for' -Anweisung zu kommentieren und die Ausgabemethode zu printing() zu ändern. Nichts passiert außer, dass meine Shell die Abfrage akzeptiert und mir einen neuen Befehl gibt Linie.Hier ist meine letzte Test: def lettersWhitespace(): mit open ('C: \\ Users \\ Charles \\ Test.txt', 'rb +') als infile: für Zeile in infile: print (Linie) –

Verwandte Themen