我有两个文件 - prefix.txt和terms.txt都有大约100行。我想用笛卡尔产品
写出第三个文件http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join
- 大约10000行。
在Python中处理此问题的最佳方法是什么?
其次,有没有办法以随机顺序将10,000行写入第三个文件?
答案 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]
从a
和b
的每个元素中删除尾随的newlline。
修改:使用s.strip()
代替s[:-1]
来摆脱换行符 - 它更具便携性。