我正在尝试在Python中处理一个包含^M字符的csv文件,这些字符在每一行/行中都是换行符。除'rU'模式外,我无法以任何其他模式打开该文件。
如果我以“rU”模式打开文件,它会读取换行符并拆分文件(创建新行),从而使我拥有两倍数量的行。
我希望完全删除换行符。怎么办?
请注意,正如文档所说:
csvfile可以是任何支持迭代器协议的对象,每次调用其
next()
方法时返回一个字符串-文件对象和列表对象都适用。
因此,在将其交给reader
或DictReader
之前,您总是可以在文件上放一个过滤器。 相比之下:
with open('myfile.csv', 'rU') as myfile:
for row in csv.reader(myfile):
这样做:
with open('myfile.csv', 'rU') as myfile:
filtered = (line.replace('\r', '') for line in myfile)
for row in csv.reader(filtered):
'\r'
是Python(和C)中表示^M
的方式。因此,这只是通过用空字符串替换每个^M
字符来删除它们出现的任何位置上的所有^M
字符。
我想永久修改文件,而不是过滤它。
首先,如果您想在运行Python脚本之前修改文件,为什么不在Python之外进行修改?sed
、tr
、许多文本编辑器等都可以为您完成此操作。这里有一个GNU sed示例:
gsed -i'' 's/\r//g' myfile.csv
但如果你想用Python做这件事,它并不会更冗长,而且你可能会发现它更易读,所以:
首先,如果你想在文件中插入或删除内容,并不能真正地就地修改文件。通常的解决方案是编写一个新文件,然后将新文件移动到旧文件上(仅限Unix),或者删除旧文件(跨平台)。
跨平台版本:
os.rename('myfile.csv', 'myfile.csv.bak')
with open('myfile.csv.bak', 'rU') as infile, open('myfile.csv', 'wU') as outfile:
for line in infile:
outfile.write(line.replace('\r'))
os.remove('myfile.csv.bak')
更为简洁但仅适用于Unix系统的版本:
temp = tempfile.NamedTemporaryFile(delete=False)
with open('myfile.csv', 'rU') as myfile, closing(temp):
for line in myfile:
temp.write(line.replace('\r'))
os.rename(tempfile.name, 'myfile.csv')
dos2unix
是你想要的。 - squiguy