Python 2.7 中换行符无法正常工作

4

我写了一个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兼容。非常感谢!


3
Python 2.7的open函数中没有newline参数。 - ᴀʀᴍᴀɴ
Python 2.7 中是否有类似于换行符的参数? - Cesar
Python 3.5的Open函数文档:https://docs.python.org/3/library/functions.html#open - ᴀʀᴍᴀɴ
1
我不确定为什么你需要 newline=''。它将对象置于通用换行模式,并返回未更改的换行符。因此,例如,\r\n 保持不变。但是 csv reader 剥离了换行符,所以它实际上并不需要。如果您在 "rU" 模式下打开文件,则会获得通用换行符,但它们会被转换为 \n。但是谁在乎呢,csv reader 对此没有问题。尝试在 "rU" 模式下打开。 - tdelaney
1
Python 2.x的csv模块更喜欢以二进制模式(rb'和'wb')打开文件,并根据csv方言处理换行符。我之前没有注意到Python 3.x需要在newline=''模式下使用r'w'`。由于这些签名有很大的不同,因此采用打开方式不同的中间函数似乎是最好的方法。 - tdelaney
显示剩余3条评论
1个回答

4
简短回答:使用与Python 3的open相同签名的io.open。
csv模块可以处理换行符,因此它可以处理不同于本地文件系统编码的换行符。例如,某个方言可能希望在Linux上写入\r\n换行符。在Python 2中,解决方法是以二进制模式打开文件。
在Python 3中,情况有所不同。以二进制模式打开的文件返回bytes对象,需要解码才能成为Unicode字符串对象。您可以以文本模式打开,但这样做会执行两个操作-解码和换行符转换。因此,发明了newline关键字。它让您以文本模式打开进行解码,但在字符串中保留换行符。
这个功能也可在io.open函数中使用,该函数在Python 2和3上都可用。您还需要做出某种编码决策。默认情况下是sys.getfilesystemencoding()返回的编码类型。您可能需要首先决定如何编码csv文件,并在文件中使用该编码。

请翻译《将Python 2移植到3 HOWTO》中文本与二进制数据一章的第六段。 - wwii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接