如何从没有引号的文件加载嵌套列表?

时间:2013-09-21 15:30:42

标签: python file python-3.x save

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

[["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 个答案:

答案 0 :(得分: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']]