Python 对文本文件中的行重新排序(循环辅助)

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]

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