获取文本文件Python中的特定节并保存到dict unbudlocalerror
我正在一个flask服务器上工作,它接受.log文件帖子(基本上只是一个文本文件)。这些文件包含调用命令行smartctl命令产生的数据 smartctl-a/dev/sda 我让它工作,但我使用了文件中的行号硬编码,这不是最佳的,因为行的数量可能会因不同的硬盘而异。 以下是我工作代码的一部分:获取文本文件Python中的特定节并保存到dict unbudlocalerror,python,Python,我正在一个flask服务器上工作,它接受.log文件帖子(基本上只是一个文本文件)。这些文件包含调用命令行smartctl命令产生的数据 smartctl-a/dev/sda 我让它工作,但我使用了文件中的行号硬编码,这不是最佳的,因为行的数量可能会因不同的硬盘而异。 以下是我工作代码的一部分: def parse_line(line): # For colons; device info splitted = line.split(':') return splitted[0]
def parse_line(line): # For colons; device info
splitted = line.split(':')
return splitted[0], splitted[1].strip()
file_body = request.form['smartdata']
lines = file_body.split("\n")
my_data = {} # Empty dictionary object
for line in lines[4:22]: # Device info
if ":" in line:
if line.startswith("Device is:"): # Not necessary
pass
else:
key, value = parse_line(line)
my_data[key] = value
我尝试在.log文件中搜索节标题,以确定应该进行何种拆分
def parse_line(line): # For colons; device info
splitted = line.split(':')
return splitted[0], splitted[1].strip()
copy = False
device_info = {}
for line in lines:
if line.strip() == "=== START OF INFORMATION SECTION ===": #start of device info
copy = True
if line.strip() == "=== START OF READ SMART DATA SECTION ===": #start of smart data section, end of device info
copy = False
if copy: #if iterating lines and passed the information section header, true and sends said line to the parse_line method
key, value = parse_line(line)
device_info[key] = value
但是,我得到以下错误:
UnboundLocalError:赋值前引用的局部变量“value”
我不太明白我怎么会从
device_info[key] = value
因为我基本上是在做与以前相同的事情。设备信息[key]=value行不应该位于分配了
值的同一块中吗
def parse_line(line): # For colons; device info
splitted = line.split(':')
return splitted[0], splitted[1].strip()
copy = False
device_info = {}
for line in lines:
if line.strip() == "=== START OF INFORMATION SECTION ===": #start of device info
copy = True
if line.strip() == "=== START OF READ SMART DATA SECTION ===": #start of smart data section, end of device info
copy = False
if copy: #if iterating lines and passed the information section header, true and sends said line to the parse_line method
key, value = parse_line(line)
# Now value will always be defined.
device_info[key] = value
正如一些人所说,设备信息应该正确缩进。我必须添加一个检查,看看“:”是否在行中,然后才给我的dict赋值,因为我的parse_line方法需要一个冒号来分隔行。下面的代码可以工作
def parse_line(line): # For colons; device info
splitted = line.split(':')
return splitted[0], splitted[1].strip()
copy = False
device_info = {}
for line in lines:
if line.strip() == "=== START OF INFORMATION SECTION ===":
copy = True
if line.strip() == "=== START OF READ SMART DATA SECTION ===":
copy = False
if copy and ":" in line: # Make sure : is in line to use parse_line
key, value = parse_line(line)
# Value will be defined
device_info[key] = value
因为当您到达行设备信息[key]=value时,值未定义,请缩进两次我的数据[key]=value
行,然后重试。@shrewmouse是的,我注意到了。我不知道如何解决这个问题。我已经尝试过不同的事情了。在没有错误时获取emtpy dict。@MauroBaraldi,这是旧的工作代码的一部分。如果你的意思是device\u info[key]=value
,我试过了,结果得到了一个空的dict。我也这么认为,但不知怎的,如果我试过这个,我得到了一个空的dict。不过,我觉得很愚蠢,我在if语句之前加了一行if:“In line:
。但是有了这一行,它永远不会到达信息的开始部分。我在最后一个if语句中添加了这个if:“in line:
,以否定另一个错误并填充dict,但这更像是我的文本文件数据的问题。谢谢你的帮助。永远不要觉得自己愚蠢。如果你在一个问题上苦苦挣扎太久而没有寻求帮助;那太愚蠢了。