替换列表 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://www.asciitable.com/

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')