替换列表 python 中的回车 returns
Replace carriage returns in list python
我有一个值列表,需要删除出现在值列表中的错误回车 returns。
我要删除的文件格式如下。
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
我正在寻找解决类似上述情况的情况,其中最后 2 行数据的第 3 和第 4 个值中存在错误的运输 returns。
我看过一些关于如何解决这个问题的帖子,但到目前为止,没有任何解决办法。我已经粘贴了到目前为止我尝试过的代码。
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", "")
\n 字符是换行符。 \r 是回车 return:
http://en.cppreference.com/w/cpp/language/escape
所以,
> line.replace("\n", "")
应该是
line.replace("\r", "")
请检查它是否真的是单独的 \r 或 \r\n 对。 Windows/DOS 使用 \r\n,
Mac&Co使用\r,Linux单独使用\n
注意:我假设您有额外的换行符 ('\n'
) 而不是回车符 returns ('\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
您必须计算字段数,每行匹配 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')
以下将删除每个字段中嵌入的任何回车 return 个字符:
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')
我有一个值列表,需要删除出现在值列表中的错误回车 returns。
我要删除的文件格式如下。
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
我正在寻找解决类似上述情况的情况,其中最后 2 行数据的第 3 和第 4 个值中存在错误的运输 returns。
我看过一些关于如何解决这个问题的帖子,但到目前为止,没有任何解决办法。我已经粘贴了到目前为止我尝试过的代码。
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", "")
\n 字符是换行符。 \r 是回车 return:
http://en.cppreference.com/w/cpp/language/escape
所以,
> line.replace("\n", "")
应该是
line.replace("\r", "")
请检查它是否真的是单独的 \r 或 \r\n 对。 Windows/DOS 使用 \r\n, Mac&Co使用\r,Linux单独使用\n
注意:我假设您有额外的换行符 ('\n'
) 而不是回车符 returns ('\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
您必须计算字段数,每行匹配 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')
以下将删除每个字段中嵌入的任何回车 return 个字符:
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')