Python-将字符串追加到文件的现有行

时间:2018-07-20 14:08:40

标签: python enumerate read-write pathlib

我有一个原始文件(fo.log),如下所示:

title1  title2  title3
o11     o12     o13
o21     o22     o23
o31     o32     o33

还有一个目标文件(fd.log),如下所示:

d11   d12
d21   d22
d31   d32

两个文件的行数相同(可能是数百万行),但原始文件的标题行除外。考虑到内存使用情况,我不想将所有行都读取到内存中。

在处理完脚本之后,我想要具有如下所示的目标文件(fd.log):

d11   d12   o13
d21   d22   o23
d31   d32   o33

这意味着我获取了每个原始文件行的最新信息,并将其附加到相应的目标行。

从一个文件到另一个文件的行之间的对应关系仅仅是行的位置,与文件上的信息无关。

我能做的最接近的脚本写在下面,它可以正确打印我想要的信息。

from pathlib import Path

file_from = Path("path-to-origin-file/fo.log").open()
file_to = Path("path-to-destination-file/fd.log").open()

# create an enumerator to iterate over origin file lines
eft = enumerate(file_to)

# skip the first line with titles
next(eft)

for line_counter,line_to in eft:
    print(' '.join([
                line_to.rstrip('\n'), 
                file_from.readline().split()[2]]))

file_from.close()
file_to.close()

3 个答案:

答案 0 :(得分:1)

对于足够小的文件,您可以将文件内容准备为列表或字符串,然后将其写入文件,例如:

from pathlib import Path

with Path('in-file').open() as in_file, Path('out-file').open('r+') as out_file:
    lines = []

    for line1, line2 in zip(in_file.readlines()[1:], out_file.readlines()):
        line = '{}   {}\n'.format(line2.rstrip(), line1.split()[-1])
        lines.append(line)

    out_file.seek(0)  # rewind the output file to the beginning
    out_file.writelines(lines)

对于较大的文件,请考虑使用备份文件,就像stdlib的fileinput模块一样。

答案 1 :(得分:0)

with open('newfile.csv' 'r+b') as f:
    for line_counter,line_to in eft:
        print(' '.join(
            [line_to.rstrip('\n'), 
            file_from.readline().split()[2]])
        )

答案 2 :(得分:0)

with open('text1.txt', 'r') as istr:
    with open('text2.txt', 'r+') as ostr:
        iistr = istr.readlines()
        oostr = ostr.readlines()
        fstr = zip(iistr[1:], oostr)
        output_lines = []
        for iline, oline in fstr:
            # Get rid of the trailing newline (if any).
            output_lines.append(oline.rstrip('\n') + '  ' + iline.split()[2] + '\n')

        ostr.seek(0)
        ostr.writelines(output_lines)