2016-11-08 82 views
3

所以我写了一个格式化文本文件的python脚本,这样我就可以导入到我的SQL中。我使用python 3.5,我的代码完美工作。换行符不能用python 2.7

但是,当我尝试在python 2.7中运行我的代码时,它不起作用,它会引发此错误。 (我必须使用2.7)直到后来我才知道这一点。

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

有没有解决的办法,如果我不使用换行符,它跳过行我的数据,并将其显示为一个空白行。

这里是我的代码:

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) 

如何修改我的代码,所以它与Python 2.7兼容。非常感谢!

+3

python 2.7中没有'newline'参数''open'' – 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中,事情是不同的。以二进制模式打开的文件返回bytes需要解码才能成为unicode字符串对象的对象。您可以在文本模式下打开,但这有两个方面 - 解码和换行翻译。所以newline关键字被发明。它允许您在文本模式下打开解码,但将换行符终止符保留在字符串中。

此功能也可用于python 2和python 3上的io.open函数。您可以使用该函数来获取所需内容。注意你也需要做出某种解码决定。默认情况下它的任何sys.getfilesystemencoding()返回。您可能需要首先决定如何编码csv文件,并在文件中使用该编码。

+0

..移植Python 2的3 [HOWTO] [文本与二进制数据](https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data)中的第六段 – wwii