如何从不带引号的文件中加载嵌套列表?
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以上是关于如何从不带引号的文件中加载嵌套列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何将非通用排序列表保存到文件中,以便可以从文件中加载该排序列表?