我有一个巨大的文件,其内容是通过在不同的输入文件上反复运行可执行文件生成的。文件的模式是这样的:-file name后跟任意数量的文本行。当读取输入数据时出错,我必须拿起文件的名称,我不知道最好的方法是什么。另一个问题是,每次在短语中都会出现单词错误(最终拟合错误是(某些数值)),需要忽略。
C:\temptest\blahblah1
.. (arbitrary # of text lines)
Final fitting error : (some number) [I have to ignore this]
C:\temptest\blahblah2
.. (arbitrary # of text lines)
Error could not read data !** [I have to pick up blahblah2 and copy the file to another directory, but just logging the name would suffice]
提前致谢!
答案 0 :(得分:1)
这应该或多或少地满足您的需求:
f = open("your_file.txt")
file_name = None
for line in f:
if line.startswith(r"C:\"):
file_name = line
elif line.startswith("Error"):
print "Error for file " + file_name
假设:
- 文件名将以“C:\”开头,如果不是,则使用正则表达式执行更准确的匹配或在注释中提到的新文件之前插入特殊字符。
- 每个文件只会出现一个错误,或者为文件打印多个错误不是问题。如果不是这种情况,请在首次打印文件错误时设置一些标记,并跳过所有后续错误,直到找到新文件。
答案 1 :(得分:1)
所以你的日志文件看起来像
{filepath}\file1
{
multiple lines
}
Final fitting error : 3.2
{filepath}\file2
{
multiple lines
}
Error could not read data !
并且您想要一个导致“错误无法读取数据”消息的所有文件名列表?
import re
import os.path
skipErrs = set("Final fitting error")
saveErrs = set("Error could not read data")
LOOKFOR = re.compile('(' + '|'.join(skipErrs) + '|' + '|'.join(saveErrs) + ')')
class EOF_Exception(Exception): pass
def getLine(f):
t = f.readline()
if t=='':
raise EOF_Exception('found end of file')
else:
return t.strip()
def getFilePath(f):
return os.path.normpath(getLine(f))
errorfiles = []
with open('logfile.txt') as inf:
while True:
try:
filepath = getFilePath(inf)
s = getLine(f)
m = re.match(s)
while not m:
s = getLine(f)
m = re.match(s)
if m.group(1) in saveErrs:
errorfiles.append(filepath)
except EOF_Exception:
break
答案 2 :(得分:0)
如果要将任何标题追加到文件行,则使用special:
[line[len(special):].strip() for line in file if line.startswith(special)]
您也可以使用正则表达式,但添加自己的标题会更加健壮,除非您确定任意行无法以有效的文件名开头。
答案 3 :(得分:0)
import shutil
f=open("file")
o=open("log","a")
for line in f:
if line.lstrip().startswith("C:"):
filename = line
if "Error" in line or "error" in line:
o.write( filename +"\n")
shutil.move(line,another_directory)
f.close()
o.close()