Python - 文件中的行 - 所有组合

时间:2009-04-26 13:35:19

标签: python file-io random

我有两个文件 - prefix.txt和terms.txt都有大约100行。我想用笛卡尔产品

写出第三个文件

http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join

- 大约10000行。

在Python中处理此问题的最佳方法是什么?

其次,有没有办法以随机顺序将10,000行写入第三个文件?

3 个答案:

答案 0 :(得分:4)

您需要itertools.product

for prefix, term in itertools.product(open('prefix.txt'), open('terms.txt')):
    print(prefix.strip() + term.strip())

打印,累积或直接书写。您需要.strip(),因为每个新行都附带换行符。

之后,您可以使用random.shuffle(list(open('thirdfile.txt'))对它们进行随机播放,但我不知道您正在使用的大小的文件有多快。

答案 1 :(得分:1)

笛卡尔积计算所有组合。枚举所有组合的最简单方法是使用嵌套循环。

您无法非常轻松地以随机顺序编写文件。要写入“随机”位置,您必须使用file.seek()。您如何知道您将寻求的位置?你怎么知道每个部分(前缀+术语)有多长?

但是,您可以将整个文件读入内存(100行无效),并以“随机”顺序处理内存中的集合。这将确保输出是随机的。

答案 2 :(得分:1)

from random import shuffle
a = list(open('prefix.txt'))
b = list(open('terms.txt'))
c = [x.strip() + y.strip() for x in a for y in b]
shuffle(c)
open('result.txt', 'w').write('\n'.join(c))

当然,在速度和记忆方面不是最好的方式,但10000不足以牺牲简洁性。您通常应关闭文件对象,并且可以遍历至少一个文件而不将其内容存储在RAM中。 这个:[:-1]ab的每个元素中删除尾随的newlline。

修改:使用s.strip()代替s[:-1]来摆脱换行符 - 它更具便携性。