在文件中有效的字符串搜索方式

时间:2012-05-24 17:04:53

标签: python

我有两个文件'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个条目,我认为这种程序需要花费太多时间。有没有什么方法可以让我正确快速地完成任务。非常感谢。谢谢

7 个答案:

答案 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)

一些优化:

  1. 使用set进行更快速的搜索
  2. 将示例中的行拆分为第一个空格字符
  3. 与使用print>>时不同,输出文件中没有其他新行或打印()
  4. 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文件进行排序,然后尝试二进制搜索!