1

我必须搜索可能具有任何扩展名的文件。所有这些文件的特殊属性是它们的长度小于 5 行(小于 4 \n\r),并且除了换行符之外,所有字符都是数字、空格和逗号。我将如何编写根据文件内容搜索文件的代码?

我很清楚这将需要很长时间才能运行。

我的项目不需要 Java 或 Python,我只是简单地提到了它们,因为我更熟悉它们。Powershell 是一个有价值的建议。

我正在运行 Windows 7 系统。

4

4 回答 4

1

您可以使用grep -r-l选项。-r允许您在所有文件的目录中递归搜索,并仅-l打印内容与您的正则表达式匹配的文件的名称。

grep -r -l '\A([0-9, ]+\s){1,4}[0-9, ]+\Z' directory

这将打印包含少于 5 行数字、空格或逗号字符的所有文件的名称列表。

\A 和 \Z 将检查主题文本的开头和结尾。[0-9, ]+查找后跟\s换行符、空格或回车符的数字、空格或逗号序列。这个序列最多可以重复 4 次,{1,4}后面跟着另一行数据。

于 2012-10-24T04:39:46.127 回答
1

像下面这样的东西应该可以工作:

valid_chars = set('0123456789, \r\n')
for root, dirs, files in os.walk(base):
    for fname in files:
        fpath = os.path.join(root, fname)
        with open(fpath, 'rb') as f:
            lines = []
            for i, line in enumerate(f):
                if i >= 5 or not all(c in valid_chars for c in line):
                    break
            else:
                print 'found file: ' + fpath

而不是not all(c in valid_chars for c in line),您可以使用正则表达式:

            ...
                if i >= 5 or not re.match(r'[\d, \r\n]*$', line):
            ...

如果您使用正则表达式,以提高效率re.compile,请在循环外使用。

于 2012-10-23T22:12:11.327 回答
1
import os

expected_chars = set(' ,1234567890\n\r')
nlines = 5
max_file_size = 1000  # ignore file longer than 1000bytes, this will speed things up


def process_dir(out, dirname, fnames):
    for fname in fnames:
    fpath = os.path.join(dirname, fname)

    if os.path.isfile(fpath):

        statinfo = os.stat(fpath)

        if statinfo.st_size < max_file_size: 
            with open(fpath) as f:
                # read the first n lines
                firstn = [ f.readline() for _ in range(nlines)]

                # if there are any more lines left this is not our file
                if f.readline():
                    continue

                # if the first n lines contain only spaces, commas, digits and new lines
                # this is our kind of file add it to the results.
                if not set(''.join(firstn)) - expected_chars:
                    out.append(fpath)


out = []
path.walk("/some/path/", process_dir, out)
于 2012-10-23T22:26:06.317 回答
0

在 Python 中(我只会概述这些步骤,以便您可以自己编程。当然,如果您遇到问题,请随时询问):

  • 用于os.path.walk查找所有文件(它为您提供所有文件,无论其扩展名如何)。
  • 请注意,它还为您提供目录等,因此请使用os.path.isfile跳过它们。
  • 对于每个文件:
    • 打开它 ( open)。在语句中执行以下with操作以避免手动关闭文件。
    • 您可以先数行数,然后检查逗号,但这可能会更慢,所以:
    • 逐行读取文件。对于每一行,做两件事:
    • 数线。如果您在 5 点到达,请继续下一个文件。
    • 检查它是否符合逗号标准。我会用一个regular expression。如果不匹配,请继续。
    • 如果你在文件的末尾,你就成功了,所以你可以打印文件名或任何你想做的事情。
于 2012-10-23T22:13:45.070 回答