如何从test1.log提取length字段值?解决TypeError问题
解决TypeError: string indices must be integers的问题
这个问题我熟!咱们先来搞清楚报错的原因,再一步步解决:
为什么会报错?
你从文件里读取的每一行line是字符串类型,而不是你以为的字典。字符串只能用整数下标(比如line[0]取第一个字符)来访问,直接用line['length']这种键索引自然会抛出类型错误。
你的test1.log里的内容虽然看起来像字典,但本质是一段文本字符串,必须先把它转换成Python真正的字典对象,才能用键来取值。
正确的解决方案
我们可以用Python的ast.literal_eval()方法(比eval()安全得多,不会执行恶意代码)把字符串格式的字典转换成真实的字典。同时推荐用with语句来操作文件,它会自动帮你关闭文件,避免资源泄漏。
修改后的代码如下:
import ast def validate_file(f): with open(f, 'r') as fname: # 读取文件全部内容,同时去掉首尾可能的空白/换行符 content = fname.read().strip() # 将字符串解析为合法的Python字典 data_dict = ast.literal_eval(content) # 现在就可以正常提取length字段的值了 print(data_dict['length']) validate_file("test1.log")
为什么不用eval()?
虽然eval(content)也能把字符串转成字典,但eval()会执行字符串里的任意代码,如果文件内容被篡改(比如包含恶意代码),会带来安全风险。而ast.literal_eval()只会解析Python的字面量类型(字典、列表、字符串、数字等),是更安全的选择。
内容的提问来源于stack exchange,提问作者Rads
相关产品推荐
相关产品推荐

