我有一个值列表,需要在值列表中删除错误的回车符。
我想要删除这些文件的格式如下。
field1|field2|field3|field4|field5
value 1|value 2|value 3|value 4|value 5
value 1|value 2|value 3|value 4|value 5
value 1|value 2|val
ue 3|value 4|value 5
value 1|value 2|value 3|va
lue 4|value 5
我希望解决上面的情况,即最后两行数据的第3和第4值存在错误的回车。
我已经看过一些关于如何解决这个问题的帖子,但到目前为止还没有任何方法可以解决这个问题。我已粘贴到目前为止我尝试过的代码。
import os
import sys
filetoread = 'C:\temp\test.dat'
filetowrite = 'C:\emp\test_updated.dat'
'''
Attempt 1
'''
with open(filetoread, "r+b") as inf:
with open(filetowrite, "w") as fixed:
for line in inf:
fixed.write(line)
'''
Attempt 2
'''
for line in filetoread:
line = line.replace("\n", "")
'''
Attempt 3
'''
with open(filetoread, "r") as inf:
for line in inf:
if "\n" in line:
line = line.replace("\n", "")
答案 0 :(得分:0)
\ n字符是换行符。 \ r \ n是回车:
http://en.cppreference.com/w/cpp/language/escape
所以,
> line.replace("\n", "")
应该是
line.replace("\r", "")
检查它是否真的\ r \ n单独或\ r \ n对。 Windows / DOS使用\ r \ n, Mac& Co使用\ r \ n,Linux单独使用\ n
答案 1 :(得分:0)
注意:我假设你有额外的换行符('\n'
)而不是回车符('\r'
)。
def remove_newlines_in_fields(data, ncols, sep):
sep_count = 0
for c in data:
if c == sep:
sep_count += 1
if c == '\n':
if sep_count == ncols - 1:
yield c
sep_count = 0
else:
yield c
另请注意,如果您在最右边的列中有换行符,则无法正常工作。 (部分列将被添加到下一行。)
这是在行动:
>>> s = '''field1|field2|field3|field4|field5
... value 1|value 2|value 3|value 4|value 5
... value 1|value 2|value 3|value 4|value 5
... value 1|value 2|val
... ue 3|value 4|value 5
... value 1|value 2|value 3|va
... lue 4|value 5'''
>>> print(''.join(remove_newlines_in_fields(s, 5, '|')))
field1|field2|field3|field4|field5
value 1|value 2|value 3|value 4|value 5
value 1|value 2|value 3|value 4|value 5
value 1|value 2|value 3|value 4|value 5
value 1|value 2|value 3|value 4|value 5
答案 2 :(得分:0)
您必须计算字段数,以匹配每行5个:
import re
with open(filetoread, "r+b") as inf:
with open(filetowrite, "w") as fixed:
for l in re.finditer('(?:.*?\|){4}(?:.*?)\n', inf.read(), re.DOTALL):
fixed.write(l.group(0).replace('\n','') + '\n')
答案 3 :(得分:0)
以下内容将删除每个字段中嵌入的任何回车字符:
with open(filetoread, "rb") as inf:
with open(filetowrite, "w") as fixed:
for line in (line.rstrip() for line in inf):
fields = (field.replace('\r', '') for field in line.split('|'))
fixed.write('|'.join(fields) + '\n')