2016-11-08 17 views
3

私は自分のSQLにインポートできるようにテキストファイルをフォーマットするpythonスクリプトを書いています。私はPython 3.5を使用しており、私のコードは完璧に動作します。改行がpython 2.7で動作しない

しかし、Python 2.7でコードを実行しようとすると、機能しなくなり、このエラーがスローされます。 (私は2.7を使用する必要があります)私はこれまで分からなかった。

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

改行を使用しないと、データ内の行がスキップされ、空白行として表示されます。それは、Python 2.7との互換性がありますので、私は自分のコードを変更するにはどうすればよい

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) 

は、ここに私のコードです。本当にありがとう!

+3

python 2.7の 'open'関数に' newline'引数はありません – Arman

+0

python 2.7のnewlineに似た引数がありますか? – Cesar

+0

[Python 3.5 Open function doc](https://docs.python.org/3/library/functions.html#open) – Arman

答えて

3

短い答え:io.openは、python 3のopenと同じ署名を使用してください。

csvモジュールは、ローカルファイルシステムエンコーディングとは異なる行末を処理できるように、行末を処理します。例えば、方言はlinux上でさえも\r\nの行末を書きたいかもしれません。 Python 2では、解決策はバイナリモードでファイルを開くことでした。

python 3では、ものが異なります。バイナリモードで開いたファイルは、Unicode文字列オブジェクトになるためにデコードする必要があるオブジェクトであるbytesを返します。テキストモードで開くことができますが、デコードと改行の2つのことがあります。そこで、newlineというキーワードが発明されました。それはデコードのためにテキストモードで開くことができますが、改行ターミネータは文字列に残します。

この機能は、Python 2と3の両方で利用可能なio.open関数でも利用できます。この関数を使用して、必要なものを得ることができます。デコードの決定をする必要があることに注意してください。デフォルトでは、sys.getfilesystemencoding()が返します。最初にcsvファイルをどのようにエンコードするかを決める必要があり、そのエンコードをファイルで使用する必要があります。

+0

.. Porting Python 2 to 3 HOWTOの[Text versus Binary data]の第6段落(https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data) – wwii

関連する問題