gpt4 book ai didi

Python获取文件中的行号

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:48 24 4
gpt4 key购买 nike

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

如何获取真实行号?

感谢您的帮助。

最佳答案

除了行尾问题,这段代码还有其他一些问题

文件句柄

如评论中所述,最好使用 with 语句打开文件

功能分离

现在您有 1 个大循环,您在其中循环遍历原始文件、解析它并立即写入 ReportFile。我认为最好将它们分开。

创建一个函数来遍历日志,返回您需要的详细信息,然后创建一个函数来遍历这些详细信息并将它们写入报告。这更加健壮,并且在出现问题时更容易调试和测试

我也会让 IO 尽可能多地放在外面。如果您稍后想要流式传输到套接字或其他东西,这可以轻松完成

干燥

你的代码第6到24行有很多行几乎是一样的,如果你想再添加一个你想报的错误,你需要再添加5行代码,几乎是一样的。我会使用 dict 和 for-loop 来削减样板代码

python

一个较小的评论是你不使用 Python 提供的方便的东西,比如 yield with -statement,enumeratecollections.counter 变量命名也不符合 PEP-8,但主要是美观

我的尝试

errors = {
error_hostname_count: {'error_msg' = '--- Error: GET HOST BY NAME @ line %i'},
error_socker_462: {'error_msg' = '--- Error: SOCKET -462 @ line %i'},
error_hostname_count: {'error_msg' = '--- Error: MEMORY NOT RELEASED @ line %i'},
}

在这里您可以定义可能发生的错误以及错误消息应该是什么样子

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

这只需要一个文件句柄(也可以是一个 Stream 或 Buffer)并在那里寻找 error_codes,如果找到一个,它会连同该行一起产生

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

这会遍历发现的错误。它增加了他们的计数器,格式化消息并将其写入 report_file

def format_error_msg(line_no, error_code):
return errors[error_code['error_msg'] % line_no

这使用字符串格式从 error_code 和 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)

这将它们联系在一起。您可以使用 error_counter 向报告添加摘要,或将摘要写入另一个文件或数据库。

这种方法的优点是,如果您的错误识别发生变化,您可以独立于报告执行此操作,反之亦然

关于Python获取文件中的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44537839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com