2016-03-19 8 views
0

Ich öffne eine Datei und wenn eine bestimmte Bedingung erfüllt ist, öffne eine andere Datei und übertrage die Datensätze von der ersten Datei auf die zweite und lösche sie dann von der ersten. Der folgende Code funktioniert, mit Ausnahme der Zeile f.truncate(), die den Fehler im Titel dieses Beitrags verursacht. Kann mir jemand sagen, was ich ändern muss, damit das funktioniert?IOError: Datei nicht zum Schreiben geöffnet - Python

f = open(filename,"r") 
d = f.readlines() 
f.seek(0) 
for i in d: 
    e = i.split(',') 
    if len(e) > 28: 
     with open(filename2, "a") as text_file: 
      text_file.write(i.encode('cp1252')) 
     text_file.close 
f.truncate()   
f.close() 

Antwort

4

Sie haben die erste Datei als "r+" öffnen, um zu lesen und zu schreiben, etwa so:

f = open(filename,"r+") 
for line in f: 
    e = line.split(',') 
    if len(e) > 28: 
     with open(filename2, "a") as text_file: 
      text_file.write(line.encode('cp1252')) 
f.seek(0) 
f.truncate()   
f.close() 

Ich habe auch den Code effizienter, da sie über die Zeilen iterieren sollte statt Kopieren Sie sie zur Seite. Ein noch effizienteren Ansatz wäre dies:

with open(filename,"r+") as file1, open(filename2, "a") as file2: 
    for line in f: 
     if line.count(',') > 27: 
      file2.write(line.encode('cp1252')) 
    file1.truncate(0) 

diese Weise können Sie jede Iteration die Datei öffnen nicht, und da Sie nicht die geteilten Werte verwenden, können Sie nur die Kommas zählen (,) und vergleichen bis 27 statt nur 28

entfernen der kopierten Linien

Wenn Sie nur die kopierten Linien entfernen möchten, und die Datei nicht leer ist, haben Sie keine Möglichkeit andere als die gesamte Datei in den Speicher zu kopieren oder Verwenden Sie eine tempfile.

, dass so, wie es in dem Speicher durch Kopieren zu tun ist:

with open(filename,"r+") as file1, open(filename2, "a") as file2: 
    file_lines = file1.readlines() 
    file1.seek(0) 
    file1.truncate() 
    for line in file_lines: 
     if line.count(',') > 27: 
      file2.write(line.encode('cp1252')) 
     else: 
      file1.write(line) 

Bitte stellen Sie sicher, dass eine Codierung angeben, wenn Sie Python 3.X verwenden

+0

im Versuch, es zu bekommen, so dass nur die kopierten Zeilen gelöscht werden, aber wenn ich über den ersten Code verwende, leert er die gesamte erste Textdatei Wie ändere ich, damit nur die ausgewählten Zeilen gelöscht werden? – gdogg371

+0

@ gdogg371 Meine Antwort entsprechend aktualisiert. – Bharel

+0

Ihr aktualisierter Code ist falsch und beschädigt den Inhalt von 'file1'. – alexis

0

Stellen Sie sich vor, Sie lesen Datei1, teilen sie in zwei Teile auf und schreiben die Teile in Datei1 und Datei2. Ich würde nicht einmal mit truncate() stören, da eine Datei zum Schreiben zu öffnen kürzt es:

with open(filename1) as file1: 
    data = file1.readlines() 

lines1 = [] 
lines2 = [] 
for line in data: 
    if len(line.split(",")) > 28: 
     lines2.append(line) 
    else: 
     lines1.append(line) 

with open(filename1, "w", encoding='cp1252') as outfile: # Wipes out old contents 
    outfile.writelines(lines1) 

with open(filename2, "w", encoding='cp1252') as outfile: 
    outfile.writelines(lines2) 
Verwandte Themen