Python 对文本文件中的行重新排序(循环辅助)
A有一个相当大的文本文件,我需要重新排列行,如Python 对文本文件中的行重新排序(循环辅助),python,Python,A有一个相当大的文本文件,我需要重新排列行,如 line1 line2 line3 重新排序为这样 line2 line1 line3 文件将继续使用更多行,并且必须进行相同的重新排序。我被卡住了,需要一个循环来完成。不幸的是,我遇到了减速带 with open('poop.txt') as fin, open('clean330.txt', 'w') as fout: for line in fin: ordering = [1, 0, 2]
line1
line2
line3
重新排序为这样
line2
line1
line3
文件将继续使用更多行,并且必须进行相同的重新排序。我被卡住了,需要一个循环来完成。不幸的是,我遇到了减速带
with open('poop.txt') as fin, open('clean330.txt', 'w') as fout:
for line in fin:
ordering = [1, 0, 2]
for idx in ordering: # Write output lines in the desired order.
fout.write(line)
你一次可以读3行
with open('poop.txt') as fin, open('clean330.txt', 'w') as fout:
line1 = True
while line1:
line1 = fin.readline()
line2 = fin.readline()
line3 = fin.readline()
fout.write(line2)
fout.write(line1)
fout.write(line3)
查看itertools文档中的函数grouper。然后,您需要执行以下操作:
for lines in grouper(3, fin, '')
for idx in [1, 0, 2]:
fout.write(lines[idx])
如果输入文件没有3行的精确倍数,您尚未指定要执行的操作。此代码使用空格。对于单行交换,代码可以如下所示:
with open('poop.txt') as fin, open('clean330.txt', 'w') as fout:
for idx, line in enumerate(fin):
if idx == 0:
temp = line # Store for later
elif idx == 1:
fout.write(line) # Write line 1
fout.write(temp) # Write stored line 0
else:
fout.write(line) # Write as is
对于重复交换,条件可以是e。Gidx%3==0,具体取决于要求。如果行数是3的倍数:
with open('poop.txt') as fin, open('clean330.txt', 'w') as fout:
while True:
try:
in_lines = [next(fin) for _ in range(3)]
fout.write(in_lines[1])
fout.write(in_lines[0])
fout.write(in_lines[2])
except StopIteration:
break
这里有一种方法,它利用一些Python实用程序和一个助手函数使事情变得相对简单。如果文件中的行数不是要重新排序的组长度的精确倍数,则可以不进行排序,但可以根据需要轻松更改 grouper helper函数与配方相似,但不完全相同,配方名称与itertools中显示的相同
你看过你的产出了吗?你所做的就是把每一行输入写三遍。我希望这类知识对我来说是自然的。干得好。您的代码没有正确使用grouper函数的itertools配方。
from itertools import zip_longest
from operator import itemgetter
def grouper(n, iterable):
''' s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ... '''
FILLER = object() # Value which couldn't be in data.
for result in zip_longest(*[iter(iterable)]*n, fillvalue=FILLER):
yield tuple(v for v in result if v is not FILLER)
ordering = 1, 0, 2
reorder = itemgetter(*ordering)
group_len = len(ordering)
with open('poop.txt') as fin, open('clean330.txt', 'w') as fout:
for group in grouper(group_len, fin):
try:
group = reorder(group)
except IndexError:
pass # Don't reorder potential partial group at end.
fout.writelines(group)