Python获取文件中的行号
我构建了一个python(2.7)脚本,用以下代码解析txt文件:Python获取文件中的行号,python,file,parsing,line-numbers,Python,File,Parsing,Line Numbers,我构建了一个python(2.7)脚本,用以下代码解析txt文件: cnt = 1 logFile = open( logFilePath, 'r' ) for line in logFile: if errorCodeGetHostName in line: errorHostNameCnt = errorHostNameCnt + 1 errorGenericCnt = errorGenericCnt + 1 reportFile.
cnt = 1
logFile = open( logFilePath, 'r' )
for line in logFile:
if errorCodeGetHostName in line:
errorHostNameCnt = errorHostNameCnt + 1
errorGenericCnt = errorGenericCnt + 1
reportFile.write( "--- Error: GET HOST BY NAME @ line " + str( cnt ) + "\n\r" )
reportFile.write( line )
elif errorCodeSocke462 in line:
errorSocket462Cnt = errorSocket462Cnt + 1
errorGenericCnt = errorGenericCnt + 1
reportFile.write("--- Error: SOCKET -462 @ line " + str(cnt) + "\n\r" )
reportFile.write(line)
elif errorCodeMemory in line:
errorMemoryCnt = errorMemoryCnt + 1
errorGenericCnt = errorGenericCnt + 1
reportFile.write("--- Error: MEMORY NOT RELEASED @ line " + str(cnt) + "\n\r" )
reportFile.write(line)
cnt = cnt + 1
我想添加每个错误的行号,为此我添加了一个计数器(cnt),但它的值与实际行号无关
这是我的日志文件的一部分:
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2017.06.13 17:05:43 =~=~=~=~=~=~=~=~=~=~=~=
UTC Time fetched from server #1: '0.pool.ntp.org'
*** Test (cycle #1) starting...
--- Test01 completed successfully!
--- Test02 completed successfully!
--- Test03 completed successfully!
--- Test04 completed successfully!
--- Test01 completed successfully!
--- Test02 completed successfully!
INF:[CONFIGURATION] Completed
--- Test03 completed successfully!
Firmware Version: 0.0.0
*** Test (cycle #1) starting...
我怎样才能得到真实的电话号码
谢谢你的帮助。简介:我想要解析的日志来自一个用C语言编程的嵌入式平台 我在嵌入的代码中发现,某个地方有一个printf,带有\n\r而不是\r\n。我将每个\n\r替换为与windowsCR LF对应的\r\n
有了这个更改,python脚本就可以工作了!我可以通过它的行来识别错误。除了行结束问题之外,这段代码还有一些其他问题 文件句柄 如注释中的注释所述,最好使用
with
-语句打开文件
职能分离
现在,您有了一个大循环,您可以在原始文件上循环,解析它并立即写入ReportFile
。我想最好把它们分开
让一个函数在日志上循环,返回所需的详细信息,然后让下一个函数在这些详细信息上循环并将其写入报告。这将更加健壮,并且在出现问题时更易于调试和测试
我也会让IO尽可能多地离开。如果您以后想要流式传输到套接字或其他东西,这很容易做到
干的
代码的第6行到第24行包含许多几乎相同的行,如果要添加另一个要报告的错误,则需要再添加5行几乎相同的代码。我会使用一个dict
和一个for循环来剪切样板代码
蟒蛇的
一个较小的注释是,您没有使用Python提供的便利工具,例如yield
with-statement、enumerate
或collections。counter
变量命名也不是根据PEP-8
,但这主要是美观的
我的尝试
这里定义了可能发生的错误以及错误消息的外观
def get_events(log_filehandle):
for line_no, line in enumerate(log_filehandle):
for error_code, error in errors.items():
if error_code in line:
yield line_no, error_code, line
这只需要一个文件句柄(也可以是一个流或缓冲区)并在其中查找错误代码,如果它找到了错误代码,它将与行一起生成错误代码
def generate_report(report_filehandle, error_list):
error_counter = collections.Counter()
for line_no, error_code, error_line in error_list:
error_counter['generic'] += 1
error_counter[error_code] += 1
error_msg = format_error_msg(line_no, error_code)
report_file.write(error_msg)
report_file.write(error_line)
return error_counter
这将循环查找到的错误。它增加计数器,格式化消息并将其写入报告文件
def format_error_msg(line_no, error_code):
return errors[error_code['error_msg'] % line_no
这使用字符串格式从错误代码和行号生成消息
with open(log_filename, 'r') as log_filehandle, open(report_filename, 'w') as report_filehandle:
error_list = get_events(log_filehandle):
error_counter = print_events(report_filehandle, error_list)
这一切都联系在一起。您可以使用错误\u计数器
将摘要添加到报告中,或将摘要写入另一个文件或数据库
这种方法的优点是,如果您的错误识别发生变化,您可以独立于报告进行此操作,反之亦然使用
enumerate
在标题中有一个cnt=1
而您只是没有包含该行?否则,这段代码看起来没问题。你说“它的值与实际行号无关”是什么意思?我同意@smarx,cnt实际上会做作业cnt初始化为1。我还没有将cnt添加到示例中。很抱歉(固定)。我的第一个错误在第258行,但在我的报告文件中,错误标记在第240行。为什么不在循环的每次迭代中打印line
和cnt
,看看哪里出了问题?谢谢你的建议。我的python编码风格更类似于C。我有一点python知识。我尝试了你的代码,在错误上得到了“不能分配给文字”。哪一行给出了错误?因为我不知道错误代码是什么,所以您必须为第7行的工作分配一些值。你能举个例子吗?谢谢
with open(log_filename, 'r') as log_filehandle, open(report_filename, 'w') as report_filehandle:
error_list = get_events(log_filehandle):
error_counter = print_events(report_filehandle, error_list)