Python - 文件中的行 - 所有组合
我有两个文件,分别是 prefix.txt 和 terms.txt,里面大约各有 100 行内容。我想要生成一个第三个文件,这个文件包含这两个文件的 笛卡尔积。
http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join
这样会大约有 10000 行。
在 Python 中,最好的做法是什么呢?
其次,有没有办法把这 10000 行以随机的顺序写入第三个文件呢?
3 个回答
1
笛卡尔积就是列出所有可能的组合。列出所有组合最简单的方法就是用嵌套循环。
想要以随机的顺序写入文件其实不太容易。要写到一个“随机”的位置,你需要用到 file.seek()
这个命令。但是,你怎么知道要去哪个位置呢?你又怎么知道每一部分(前缀+词条)的长度是多少呢?
不过,你可以把整个文件读到内存里(100行其实没什么),然后在内存中以“随机”的顺序处理这些内容。这样可以确保输出是随机的。
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这个数字其实也不大,不值得为了简洁而牺牲性能。通常情况下,你应该关闭你的文件对象,而且你可以在不把文件内容存到内存里的情况下,至少循环读取其中一个文件。这里的 [:-1]
是用来去掉 a
和 b
每个元素末尾的换行符。
补充:使用 s.strip()
来去掉换行符,比用 s[:-1]
更加通用。
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')) ) 来打乱它们的顺序,不过我不确定在你使用的文件大小下,这个速度会有多快。