如何获取目录的输入

时间:2016-01-09 04:40:24

标签: python

我要做的是通过日志文件目录进行搜索,这个目录以“filename001.log”开头,目录中可能有100个文件

我想对每个文件运行的代码是检查以确保日志的第8个位置始终包含一个数字。我怀疑一个非数字正在抛弃我们的解析器。这是一些简单的代码我试图检查这个:

# import re
from urlparse import urlparse

a = '/folderA/filename*.log' #<< currently this only does 1 file
b = '/folderB/' #<< I'd like it to write the same file name as it read
with open(b, 'w') as newfile, open(a, 'r') as oldfile:
    data = oldfile.readlines()
    for line in data:
        parts = line.split()
        status = parts[8]  # value of 8th position in the log file
        isDigit = status.isdigit()

        if isDigit = False:
                print " Not A Number :",status
                newfile.write(status)

我的问题是:

  1. 如何告诉它读取目录中的所有文件? (以上实际上一次仅适用于1个文件)
  2. 如果我发现某些内容不是数字,我想将该字符写入不同文件夹中但与日志文件同名的文件中。例如,我发现filename002.log在其中一个日志行中有一个“*”。我想发布folderB / filename002.log,写入非数字字符。
  3. 听起来很简单,我只是不太擅长编码。

2 个答案:

答案 0 :(得分:1)

要读取与给定模式匹配的一个目录中的文件并写入另一个目录,请使用glob moduleos.path函数构造输出文件:

srcpat = '/folderA/filename*.log'
dstdir = '/folderB'
for srcfile in glob.iglob(srcpat):
   if not os.path.isfile(srcfile): continue

   dstfile = os.path.join(dstdir, os.path.basename(srcfile))
   with open(srcfile) as src, open(dstfile, 'w') as dst:
       for line in src:
           parts = line.split()
           status = parts[8]  # value of 8th position in the log file
           if not status.isdigit():
               print " Not A Number :", status
               dst.write(status)  # Or print >>dst, status if you want newline

即使没有找到错误的条目,也会创建空文件。你可以等到你完成处理文件(并且with块关闭)并只检查输出的文件大小并删除它,如果为空,那么你可以转向懒惰的方法在无条件开始迭代之前删除输出文件的地方,但不要打开它;只有当你得到一个错误的值时才打开文件(为了追加而不是写入以保持先前的循环&#39;输出被丢弃),写入它,允许它关闭。

答案 1 :(得分:1)

  1. 导入操作系统并使用:for filenames in os.listdir('path'):。这将列出目录中的所有文件,包括子目录。

  2. 只需使用正确的路径打开第二个文件即可。由于您已经使用上述方法迭代了文件名,因此您只需要替换目录。您可以使用os.path.join