换行不适用于python 2.7

时间:2016-11-08 15:52:02

标签: python python-2.7 python-3.x

所以我编写了一个格式化文本文件的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兼容。非常感谢!

1 个答案:

答案 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文件,并在文件中使用该编码。