【问题标题】:Python does not reads a fetched line from text file as in Dictionary formatPython 不会像字典格式那样从文本文件中读取提取的行
【发布时间】:2019-09-06 14:55:46
【问题描述】:

我有一个具有不同输入的文本输入文件,如下所示,分别以字典和列表格式存储。部分文本文件如下:

#Drive-Size-Mapping
{'root' : 50 , '\usr' : 20, 'swap' : 1}
#OS-Version
[7.1, 7.2, 7.3, 7.4, 7.5, 7.6]

如您所见,第一行是字典格式,第二行是列表格式。 现在,当我在变量中读取和存储行时,Python 无法识别格式。这是我正在尝试的代码:

 f=open("C:\\Users\xyz\\Desktop\\Inputs.txt")
lines=f.readlines()
i = lines.index("#Drive-Size-Mapping\n")
di=dict()
di = lines[i+1]
print(di[0])
j = lines.index("#OS-Version\n")
list = lines[j+1]
print(list[0])

上面的代码是:

{ {

即它只打印数组的第一个数组索引中存在的项目。 我希望 python 将这些变量分别解释为字典和列表。所以,如果我这样做print di["root"]

我的代码应该将其识别为字典并打印为50。和 print(list[0]) 应该将其识别为列表并输出7.1.

请告诉我应该如何操作文件行,以便让 python 以它们实际存在的格式解释它们?

谢谢

【问题讨论】:

  • di = lines[i+1] 完全覆盖了di = dict()index 只返回它遇到的第一个实例,因此也不适合重复数据。

标签: python list dictionary file-handling


【解决方案1】:

readlines 函数按照它所说的做:它读取行。你我都可以认识到这两行是 Python 字典和 Python 列表,但 Python 不能也不应该。

在我看来,您正在从包含 Python 源代码的文件中读取配置设置。更标准的方法是使用.ini 文件。看模块configparser

【讨论】:

  • 一个.ini 文件?我在这里错过了什么?
  • OP 说,我希望 Python 将这些变量分别解释为字典和列表。因此输入文件中的 Python 文字将被解释为数据。 OP 可以为此使用ast.literal_eval(),但我认为这是错误的方法。
  • 虽然我的查询是用上面的答案 literal_eval 完成的,但我也想了解 configparser。似乎可以使用 python 核心库并在数据结构中进行一些操作。
  • 将结构化数据作为 Python 文本存储在文本文件中似乎是一种显而易见的方式,但这是一条死胡同。配置文件有更宽容的语法,如果语法错误,configparser 会给你一个体面的错误消息,即使这样也会尽力解释它可以理解的部分。 ast.literal_eval 只会说 SyntaxError 并让您(或更糟糕的是,您的用户)对哪里出了问题一无所知。如果您必须将 Python 数据结构持久保存到磁盘(有时有很好的理由这样做),请使用pickle,而不是存储为字符串的 Python 代码的 sn-ps。
【解决方案2】:

您从文件中获得的行是string。如果要将它们转换为dictlist 对象,可以使用literal_eval

from ast import literal_eval

...
d = literal_eval(lines[i+1])
...
l = literal_eval(lines[i+1])

如果您可以更改输入文件的格式,我会考虑将其修改为json 文件,以便使用json module 方便地存储和加载您的对象。

【讨论】:

    【解决方案3】:

    只是添加到上面的答案:

    用途:

     ast.literal_eval()
    

    但是从字典的键中删除/替换“\”,因为它会在 literal_eval() 函数中产生 unicode 错误

    代码中还有一个错误,转换为字典后,你不能做 d[0] 因为字典没有索引

    【讨论】:

    • 好点!转义字符不会太好。
    • 是的,没错。我使用 d[0] 只是为了展示 python 正在解释什么。使用 literal_eval(lines[j+1]) 后效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多