替换列表python中的回车符

时间:2015-04-13 19:01:28

标签: python list csv carriage-return

我有一个值列表,需要在值列表中删除错误的回车符。

我想要删除这些文件的格式如下。

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", "")

4 个答案:

答案 0 :(得分:0)

\ n字符是换行符。 \ r \ n是回车:

http://www.asciitable.com/

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