获取文本文件Python中的特定节并保存到dict unbudlocalerror

获取文本文件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]

我正在一个flask服务器上工作,它接受.log文件帖子(基本上只是一个文本文件)。这些文件包含调用命令行smartctl命令产生的数据

smartctl-a/dev/sda

我让它工作,但我使用了文件中的行号硬编码,这不是最佳的,因为行的数量可能会因不同的硬盘而异。 以下是我工作代码的一部分:

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,但这更像是我的文本文件数据的问题。谢谢你的帮助。永远不要觉得自己愚蠢。如果你在一个问题上苦苦挣扎太久而没有寻求帮助;那太愚蠢了。