1

需要在数千个文件中搜索特定的字符串/元数据、十六进制标签等,但我所做的这个 python 代码只搜索一个需要很长时间的文件

def check():
        datafile = file('example.txt')
        found = False
        for line in datafile:
            if blabla in line:
                found = True
                break

        return found

found = check()
if found:
    print "true"
else:
    print "false"

有什么建议么?谢谢

4

4 回答 4

0

使文件名/路径成为函数的参数。然后你的函数可以处理任何文件,而不仅仅是一个特定的文件。然后,为您希望它处理的每个文件调用该函数。您可能想要列出要处理的文件名/路径,然后有一个循环来为每个文件执行您想要的操作。

例如。

def check(fname):
    datafile = open(fname)
    found = False
    # ...
    return found

files = ['a', 'b', 'c']
for fname in files:
    found = check(fname)
    if found:
        print("true")
    else:
        print("false")
于 2013-03-21T16:20:18.900 回答
0

假设文件都包含在目录“/foo”中:

import os, re
#Use a re.findall() to avoid line-by-line parsing
myrex = re.compile('blabla')

def check(filename):
    with open(filename) as myfile:
        matches = myrex.findall(myfile.read())
        return len(matches) > 0

os.chdir("/foo")
#Use an os.walk() to find the names of all files in this directory
for root,dir,files in os.walk('.'):
    for fname in files:
        print fname + ": " + str(check(fname))

如果文件存储在多个位置,则需要围绕“os.chdir()”块进行额外循环。如果您要搜索多个模式,请使用另一个“re.compile()”。

这有助于回答您的问题吗?

于 2013-03-21T16:23:14.333 回答
0

如果所有文件都在一个目录中,您可以使用os.listdir(). 这将为您提供目录中所有文件的列表。从那里,您可以使用例如os.listdir('/home/me/myData'). 如果您在基于 unix 的系统上:grep是一个非常强大的工具,它将为您提供很大的灵活性。你可能想要grep -r "your query" ./ > results.txt. 这将为您提供与您的搜索匹配的每一行,并包括使用正则表达式的选项......并将其保存到文件中。否则,仅使用 python 搜索大量文件:

def check(x):
    return "blabla" in x
files = os.listdir('/home/me/files')
for f in files:
    x = open(f, "r").read()
    print check(x)

我的检查功能的行为不同,因为它不逐行检查True并且False用大写字母打印。

我想您可能想知道结果来自哪个文件。(什么线?)

for f in files:
    x = open(f, "r").read().split('\n')
    for count in range( len(x) ):
        if check(x[count]):
            print f + " " + count + " " +x[count]

...或任何你需要知道的。

于 2013-03-21T16:45:34.293 回答
0

您可能希望考虑globos.walk检索文件名,但类似于:

import fileinput

print any(blabla in line for line in fileinput.input(['some', 'list', 'of', 'file', 'names'])

这会自动顺序读取文件,并会在真值测试中短路。

于 2013-03-21T16:29:13.170 回答