我正在尝试在 python 中处理一个 csv 文件,该文件在每行/行的中间有一个 ^M 字符,这是一个换行符。我无法以“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
通过将每个字符替换为空字符串来去除所有字符,无论它们出现在哪里。
我想我想永久修改文件而不是过滤它。
首先,如果您想在运行 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')