所以我编写了一个格式化文本文件的python脚本,以便我可以导入到我的SQL中。我正在使用python 3.5,我的代码完美无缺。
但是,当我尝试在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兼容。非常感谢!
答案 0 :(得分:3)
简短回答:使用与{3} io.open
具有相同签名的open
。
csv
模块为您处理行尾,以便它可以处理与本地文件系统编码不同的行结尾。例如,一个方言甚至可能想在linux上写\r\n
行结尾。在python 2中,解决方案是以二进制模式打开文件。
在python 3中,情况有所不同。以二进制模式打开的文件返回需要解码的bytes
个对象,以成为unicode字符串对象。您可以在文本模式下打开,但这会做两件事 - 解码和换行。因此发明了newline
关键字。它允许您以文本模式打开以进行解码,但将换行终止符保留在字符串中。
此功能也可以在python 2和3上的io.open
函数中使用。您可以使用该函数来获得所需内容。请注意,您还需要做出某种解码决策。默认情况下,无论sys.getfilesystemencoding()
返回什么。您可能需要首先决定如何编码csv文件,并在文件中使用该编码。