Python获取文件中的行号

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.

我构建了一个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.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)