我要做的是通过日志文件目录进行搜索,这个目录以“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)
我的问题是:
听起来很简单,我只是不太擅长编码。
答案 0 :(得分:1)
要读取与给定模式匹配的一个目录中的文件并写入另一个目录,请使用glob
module和os.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)
导入操作系统并使用:for filenames in os.listdir('path'):
。这将列出目录中的所有文件,包括子目录。
只需使用正确的路径打开第二个文件即可。由于您已经使用上述方法迭代了文件名,因此您只需要替换目录。您可以使用os.path.join
。