Python:读取和写入文件时的行终止

时间:2018-03-25 17:47:16

标签: python git diff line-endings

我写了一个简单的实用程序,它从文件中删除某些行。它将文件读入行列表(Python),并将它们作为单个连接字符串写回,保留新行;有些行被删除,有些行在此过程中被评论;变化的百分比可以忽略不计。不知何故差异在之前给我一个大的红色块,在之后有一个绿色的大块。用肉眼看出结果文件看起来很好;我想到了拖尾空间或类似的东西的微妙差异,但它真的可能吗?如果我在每一行添加了一些不可见的东西,那么每条红线都会跟着相应的绿线。或者我收集。

UPD:

嗯,行结尾是肯定的,我被告知。我的代码的基本要点:

def check_file(path):
    out_line = ""
    with open(path, "r") as f_r:
        for line in f_r.readlines():
            drop_it, o_line = consume_line(line)
            if drop_it:
                pass
            else:
                out_line += o_line
    with open(path, "w") as f_w:
        f_w.write(out_line)

consume_line()基本上按原样返回其参数。在某些不经常的情况下,它可能被安排为删除,或未注释/注释掉,C ++风格。在任何情况下都没有手动摆弄线路结尾。

如果没有删除任何行,则没有编辑器报告总行数发生任何变化。这些文件是在Linux上发起和处理的。

1 个答案:

答案 0 :(得分:0)

此代码设置文件中第一个eol之后的所有行结尾。尾随空间保留。

g_newline = ''


def current_nl(f):
    global g_newline

    if g_newline:
        return g_newline
    g_newline = f.newlines
    if isinstance(g_newline, tuple):
        print('!!! Something wrong. This is supposed to be the first eol in the file\n')
        return '\n'
    return g_newline


def check_file(path):
    global g_newline

    g_newline = ''
    out_line = ""

    with open(path, "r") as f_r:
        for line in f_r.readlines():
            drop_it, o_line = consume_line(line)
            if drop_it:
                pass
            else:
                out_line += o_line.rstrip('\n') + current_nl(f_r)
    with open(path, "w") as f_w:
        f_w.write(out_line)