在一个单独的fi中无序排列文本文件列表的记录

2024-09-28 22:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件列表file1.txt, file2.txt, file3.txt .. filen.txt,我需要重新整理创建一个单独的大文件作为结果*。在

要求
1给定文件的记录在进行无序处理之前需要反转
2给定文件的记录在目标文件中应保持相反的顺序
三。我不知道需要洗牌多少个文件,所以代码应该尽可能通用(例如允许在列表中声明文件名)
4文件可能有不同的大小

示例:

File1.txt
---------
File1Record1
File1Record2
File1Record3
File1Record4

File2.txt
---------
File2Record1
File2Record2


File3.txt
---------
File3Record1
File3Record2
File3Record3
File3Record4
File3Record5

输出应该如下所示:

ResultFile.txt
--------------
File3Record5   -|
File2Record2    |
File1Record4    |
File3Record4   -|
File2Record1    |
File1Record3    |-->File3 records are shuffled with the other records and 
File3Record3   -|   are correctly "reversed" and they kept the correct 
File1Record2    |   ordering
File3Record2   -|
File1Record1    |
File3Record1   -|

*我不是疯了;我必须使用结果文件.txt作为输入

编辑:
结果可以是任何你想要的,完全或部分洗牌,均匀交织,这并不重要。重要的是第1点。和2。都很荣幸。在


Tags: 文件txt列表记录file3file2record2file1record1file3record1
3条回答

这个呢:

>>> l = [["1a","1b","1c","1d"], ["2a","2b"], ["3a","3b","3c","3d","3e"]]
>>> while l:
...     x = random.choice(l)
...     print x.pop(-1) 
...     if not x:
...         l.remove(x)

1d
1c
2b
3e
2a
3d
1b
3c
3b
3a
1a

你可以用不同的方式来优化它,但这是一般的想法。如果您不能一次读取文件,但由于内存限制而需要迭代这些文件,也可以使用这种方法。那样的话

  • 从文件中读取一行,而不是从列表中弹出
  • 检查EOF而不是空列表
filenames = [ 'filename0', ... , 'filenameN' ]
files = [ open(fn, 'r') for fn in filenames ]
lines = [ f.readlines() for f in files ]

output = open('output', 'w')

while len(lines) > 0:
    l = random.choice( lines )
    if len(l)==0: 
        lines.remove(l)
    else:
        output.write( l.pop() )

output.close()

这里有一点似乎很神奇:从文件中读取的行不需要反转,因为当我们将它们写入输出文件时,我们使用list.pop(),它从列表的末尾获取项目(这里是文件的内容)。在

您可以尝试以下操作:在第一步中,zip()列表中的reversed()项:

zipped = zip(reversed(lines1), reversed(lines2), reversed(lines3))

然后,您可以再次连接zipped中的项目:

^{pr2}$

最后,您必须删除由zip()添加的所有None

lst.remove(None)

相关问题 更多 >