2016-11-08 4 views
3

Also schrieb ich ein Python-Skript, das eine Textdatei formatiert, damit ich in meine SQL importieren kann. Ich benutze Python 3.5 und mein Code funktioniert perfekt.Newline funktioniert nicht mit Python 2.7

Wenn ich jedoch versuche, meinen Code in Python 2.7 auszuführen, funktioniert es nicht und es wirft diesen Fehler. (Ich muss 2.7 benutzen) Das wusste ich erst nachher.

TypeError: 'newline' is an invalid keyword argument for this function. 

Gibt es eine Möglichkeit, um diesen, wenn ich Newline nicht verwenden, es überspringt Zeilen in meinen Daten und zeigt sie als eine leere Zeile.

Hier ist mein Code:

import csv 
import os 


my_file_name = os.path.abspath('NVG.txt') 
cleaned_file = "cleanNVG.csv" 
BulkImport_file = 'BulkImport.txt' 
remove_words = ['INAC-EIM','-INAC','TO-INAC','TO_INAC','SHIP_TO-inac','SHIP_TOINAC'] 


with open(my_file_name, 'r', newline='') as infile, open(cleaned_file, 'w',newline='') as outfile: 
    writer = csv.writer(outfile) 
    cr = csv.reader(infile, delimiter='|') 
    writer.writerow(next(cr)[:25]) 
    for line in (r[0:25] for r in cr): 

     if not any(remove_word in element for element in line for remove_word in remove_words): 
     line[11]= line[11][:5] 

     writer.writerow(line) 
infile.close() 
outfile.close() 

with open(cleaned_file, 'r') as fin, open(BulkImport_file, 'w') as fout: 
     reader = csv.DictReader(fin) 
     writer = csv.DictWriter(fout, reader.fieldnames, delimiter='|') 
     writer.writeheader() 
     writer.writerows(reader) 

Wie kann ich meinen Code ändern, so dass es mit Python 2.7 kompatibel ist. Vielen Dank!

+3

Es gibt kein 'newline' Argument in Python 2.7' open' Funktion – Arman

+0

Gibt es ein ähnliches Argument wie newline für Python 2.7? – Cesar

+0

[Python 3.5 Öffnen Sie die Funktion doc] (https://docs.python.org/3/library/functions.html#open) – Arman

Antwort

3

Die kurze Antwort: Verwenden Sie io.open, die die gleiche Signatur wie Python 3 open hat.

Das csv-Modul behandelt die Zeilenendung für Sie, sodass es mit Zeilenendungen umgehen kann, die sich von lokalen Dateisystemkodierungen unterscheiden. Zum Beispiel könnte ein Dialekt \r\n Zeilenenden sogar unter Linux schreiben wollen. In Python 2 bestand die Lösung darin, Dateien im Binärmodus zu öffnen.

In Python 3 sind die Dinge anders. Im Binärmodus geöffnete Dateien geben bytes Objekte zurück, die dekodiert werden müssen, um Unicode-String-Objekte zu werden. Sie können im Textmodus öffnen, aber das macht zwei Dinge - Decodierung und Newline-Übersetzung. Also wurde das Schlüsselwort newline erfunden. Sie können im Textmodus zum Entschlüsseln öffnen, aber den Newline-Terminator in der Zeichenfolge belassen.

Diese Funktion ist auch in der io.open-Funktion verfügbar, die auf Python 2 und 3 verfügbar ist. Sie können diese Funktion verwenden, um zu erhalten, was Sie wollen. Beachten Sie, dass Sie auch eine Dekodierungsentscheidung treffen müssen. In der Standardeinstellung wird sys.getfilesystemencoding() zurückgegeben. Sie müssen möglicherweise eine Entscheidung darüber treffen, wie Sie Ihre CSV-Dateien an erster Stelle kodieren und diese Kodierung in Ihren Dateien verwenden.

+0

.. sechsten Absatz in [Text im Vergleich zu Binärdaten] (https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data) der Portierung Python 2 bis 3 HOWTO – wwii

Verwandte Themen