如何从不带引号的文件中加载嵌套列表?

Posted

技术标签:

【中文标题】如何从不带引号的文件中加载嵌套列表?【英文标题】:How to load a nested list from a file without quotation marks? 【发布时间】:2013-09-21 15:30:41 【问题描述】:

我应该为软件批发商创建一个“库存控制”系统来分配模块。我已经创建了该程序,但我无法永久保存内容。该程序由嵌套列表组成,如下所示:

[["Ms Office", "CD", 7, "Microsoft"], ["Acrobat Reader", "DVD", 12, "Adobe"], ["Norton Antivirus", "DVD", 24, "Symantec"]]

我可以将它们保存到格式的文本文档中

['Ms Office', 'CD', 7, 'Microsoft']
['Acrobat Reader', 'DVD', 12, 'Adobe']
['Norton Antivirus', 'DVD', 24, 'Symantec']

但是当我尝试以相同格式将其作为列表加载回来时,我最终会用引号将每个条目分开,如下所示:

["['Ms Office', 'CD', 7, 'Microsoft']", "['Acrobat Reader', 'DVD', 12, 'Adobe']", "['Norton Antivirus', 'DVD', 24, 'Symantec']"]

我现在只需要去掉列表中每个项目周围的双引号。 我用来加载这个文件的代码:

filename = open('Appexstock.txt', 'r')
contents = filename.read()
thelist = [name for name in contents.split('\n') if name.split('"') if name]
filename.close()

我已经在网上搜索了几个小时并尝试了所有方法,但我仍然找不到让它工作的方法。我看到很多人建议使用 CSV 模块,但我不知道如何将它应用到我的代码中。

【问题讨论】:

【参考方案1】:

使用ast.literal_eval:

>>> from ast import literal_eval
with open('Appexstock.txt') as f:
    lis = [literal_eval(line) for line in f]
...     
>>> lis
[['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']]

要存储python对象最好使用pickle模块:

>>> import pickle
>>> data = [["Ms Office", "CD", 7, "Microsoft"], ["Acrobat Reader", "DVD", 12, "Adobe"], ["Norton Antivirus", "DVD", 24, "Symantec"]]
with open('my_data', 'w') as f:
    pickle.dump(data, f)
...     
with open('my_data') as f:
    print pickle.load(f)
...     
[['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']]

【讨论】:

我需要将从文件加载的列表保存到列表变量中,以便以后的函数中使用。 like thelist = [['Ms Office', 'CD', 7, 'Microsoft'], ['Acrobat Reader', 'DVD', 12, 'Adobe'], ['Norton Antivirus', 'DVD', 24, 'Symantec']] 当我尝试使用 pickle 代码执行此操作时,我收到错误消息:“thelist = pickle.load(f) TypeError: 'str' does not support the buffer interface”我不知道我是否'我做得对。我完全是 python 和编码的初学者 @user2802349 我已经在第一个代码中这样做了,在第二个代码中只是这样做:lis = pickle.load(data, f) @user2802349 你的代码中的f 是什么?(f 应该是一个文件对象)它适用于我。 好的。我不确定出了什么问题。我保存列表的函数: def savelists(): data = thelist with open('my_data', 'w') as f: pickle.dump(data, f) 我加载数据的代码: import pickle with open('my_data ') as f: thelist = pickle.load(data, f) print(thelist) 我应该将 'data' 设为全局变量吗? @user2802349 不要在 cmets 中粘贴代码,它不可读。使用ideone.com

以上是关于如何从不带引号的文件中加载嵌套列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ant 任务中加载文件列表作为资源?

在电源查询中加载 CSV 时如何处理多个引号?

如何将非通用排序列表保存到文件中,以便可以从文件中加载该排序列表?

如何在熊猫数据框中读取嵌套的 json 文件?

如何以编程方式在 OpenSSL 中加载 PKCS#12 文件?

如何从不带引号的 WebAPI 控制器发送带有 javascript 函数的 JSON