我有两个文件'example'和'inp'如下:
文件示例的内容:
hi wert 123
jui fgrt 345
blabla dfr 233
文件内容inp:
jui
hi
我需要获取'example'每行的第一列,如果该字符串存在于文件'inp'中,那么我想将整行'example'写入另一个文件out.txt 这是我写的代码:
f=file('example')
f1=file('inp')
for l in f.readlines():
s=l.split()
for p in f1.readlines():
if s[0] in p:
print l >> 'out.txt'
我无法获得预期的结果。而且,因为文件示例字面上有200000个条目,我认为这种程序需要花费太多时间。有没有什么方法可以让我正确快速地完成任务。非常感谢。谢谢
答案 0 :(得分:2)
这个怎么样?它首先加载inp文件,然后迭代示例文件,只打印以inp中读取的单词列表中包含的单词开头的行。
with open('inp') as inpf:
lines = [l.strip() for l in inpf]
with open('example') as exf, open('out.txt', 'w') as outf:
for l in exf:
if l.split(' ', 1)[0] in lines:
print >>outf, l
您还可以使用set
更快地进行搜索。在集合中搜索具有O(1)平均成本。只需使用以下内容更改第一个with
语句:
with open('inp') as inpf:
lines = set([l.strip() for l in inpf])
如果您使用的是Python 3,那么使用print
函数代替“旧”语句:
print(l, file=outf)
答案 1 :(得分:1)
如果“inp”是一个合理的大小,我会把它的所有字符串读成一个集合,然后遍历“example”的行
(未经测试的psudo-ish代码)
words = set()
for line in inp:
words.add(line)
for line in example:
if line[0:line.find(' ')] in words:
print line
内存集查找非常快,您只需读取一次文件。
答案 2 :(得分:1)
一些优化:
with open("inp") as f:
a = set(l.rstrip() for l in f)
with open("out.txt", "w") as o, open("example") as f:
for l in f:
if l.split(" ", 1)[0] in a:
o.write(l)
答案 3 :(得分:0)
您正在遍历文件中的每个行。尝试:
s=l.split()
for line in f1.readlines():
for p in line:
if s[0] in p:
print p, 'matches', s[0]
如果你想超快地执行此操作,请为搜索字符串编译正则表达式,并尝试在文件的整个字符串表示中找到它。
HTH。
答案 4 :(得分:0)
这个怎么样?
with open('inp') as inf:
words = inf.read()
with open('example') as inf, open('out.txt', 'w') as outf:
for line in inf:
word = line.split()[0]
if word in words:
outf.write(line)
的产率:
hi wert 123
jui fgrt 345
jui hi
答案 5 :(得分:0)
with open('inp') as inp: inp_words = set(line.strip() for line in inp)
with open('example') as example, open('result', 'w') as result:
for line in example:
if line.split()[0] in inp_words:
result.write(line)
答案 6 :(得分:-1)
您可以对inp文件进行排序,然后尝试二进制搜索!