我试图在python中处理一个csv文件,在每行/每行的中间有一个^ M字符,这是一个换行符.我无法以'rU'以外的任何模式打开文件.
如果我在'rU'模式下打开文件,它会读取换行符并拆分文件(创建换行符)并给我两倍的行数.
我想完全删除换行符.怎么样?
aba*_*ert 12
请注意,正如文档所说:
csvfile可以是任何支持迭代器协议的对象,并在每次
next()
调用其方法时返回一个字符串- 文件对象和列表对象都是合适的.
因此,在将文件交给您的reader
或之前,您始终可以在文件上粘贴过滤器DictReader
.而不是这个:
with open('myfile.csv', 'rU') as myfile:
for row in csv.reader(myfile):
Run Code Online (Sandbox Code Playgroud)
做这个:
with open('myfile.csv', 'rU') as myfile:
filtered = (line.replace('\r', '') for line in myfile)
for row in csv.reader(filtered):
Run Code Online (Sandbox Code Playgroud)
这'\r'
是Python(和C)拼写方式^M
.因此,^M
通过用空字符串替换每个字符,无论它们出现在何处,都可以将其全部删除.
我想我想永久修改文件,而不是过滤它.
首先,如果要在运行Python脚本之前修改文件,为什么不在Python之外执行此操作?sed
,tr
许多文本编辑等都可以为你做这件事.这是一个GNU sed示例:
gsed -i'' 's/\r//g' myfile.csv
Run Code Online (Sandbox Code Playgroud)
但是如果你想在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')
Run Code Online (Sandbox Code Playgroud)
不那么笨重但仅限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')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19605 次 |
最近记录: |