2

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

4

7 回答 7

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

您还可以使用 aset来加快搜索速度。在集合中搜索具有 O(1) 平均成本。只需将第一with条语句更改为:

with open('inp') as inpf:
    lines = set([l.strip() for l in inpf])

如果您使用的是 Python 3,请使用print函数而不是“旧”语句:

print(l, file=outf)
于 2012-05-24T17:16:07.600 回答
1

如果“inp”的大小合理,我会将它的所有字符串读入一个集合,然后遍历“example”的行

(未经测试的伪代码)

words = set()
for line in inp:
  words.add(line)

for line in example:
  if line[0:line.find(' ')] in words:
    print line

内存中的集合查找非常快,您只需读取每个文件一次。

于 2012-05-24T17:13:54.277 回答
1

一点优化:

  1. 使用 set 进行更快的搜索
  2. 将示例中的行拆分到第一个空格字符为止
  3. 与使用 print >> 或 print() 时不同,输出文件中没有额外的新行

.

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)
于 2012-05-24T17:18:51.890 回答
0

您正在遍历文件中的每一。尝试:

s=l.split()
for line in f1.readlines():
    for p in line:
        if s[0] in p:
            print p, 'matches', s[0]

如果您想以超快的速度执行此操作,请为搜索字符串编译一个正则表达式,并尝试在文件的整个字符串表示中找到它。

HTH。

于 2012-05-24T17:10:28.263 回答
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
于 2012-05-24T17:10:52.850 回答
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)
于 2012-05-24T17:38:33.437 回答
-1

您可以对 inp 文件进行排序,然后尝试二进制搜索!

于 2012-05-24T17:20:12.893 回答