我有一个原始文件(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()
答案 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)