2015-06-20 129 views
2

我通过使用writelines(str(list))的迭代将附加写入列表添加到文本文件中。对于短,我将用2分列出来说明:如何从python中的文件读取后转换为列表列表

list1=['[#1]:', (4, 8, 16, 29), (4, 8, 16, 30), (4, 8, 16, 32)] 
list2=['[#2]:', (3, 9, 13, 20), (3, 9, 13, 36), (3, 9, 13, 38)] 

,并在文本文件中,我有单独列出一堆:

['[#1]:', (4, 8, 16, 29), (4, 8, 16, 30), (4, 8, 16, 32)] ['[#2]:', (3, 9, 13, 20), 
(3, 9, 13, 36), (3, 9, 13, 38)] 

当我用回读文本文件导入列表readlines(file.txt),我得到一个字符串的单个列表:

["['[#1]:', (4, 8, 16, 29), (4, 8, 16, 30), (4, 8, 16, 32)], ['[#2]:', (3, 9, 13, 20), 
(3, 9, 13, 36), (3, 9, 13, 38)]"] 

这是预期的。我想要做的是在列表的开始和结尾删除'''(引号),这样我就可以遍历列表和进程列表[#1],列表[#2]等。我期望这是基本的,但我不能工作了。我会appreaciate如果有人能告诉我怎么样。提前

感谢。

回答

0

您是否尝试过pickle模块?

它是用于对象序列化后,您可以将对象(甚至是列表)转储到文件中,并直接将其直接读回。

示例 -

import pickle 
lst1 = [1,2,3,4,5] 
with open('test1.bin','wb') as f: 
    pickle.dump(lst1,f) 

with open('test1.bin','rb') as f1: 
    lst2 = pickle.load(f1) 
    print(lst2) 
>> [1,2,3,4,5] 

对于追加,您可以使用模式为ab。附加的例子 -

lst2 = [6,7,8,9,10] 
with open('test1.bin','ab') as f: 
    pickle.dump(lst2,f) 

with open('test1.bin','rb') as f1: 
    lst3 = pickle.load(f1) 
    print(lst3) 
>> [1,2,3,4,5] 
    lst4 = pickle.load(f1) 
    print(lst4) 
>> [6,7,8,9,10] 
+0

谢谢。这看起来很有希望,但我需要在重新打开之前将这些列表追加到单个文件中。你的代码将一个列表写入文件并重新打开相同的列表,但是我无法找到追加模式(而不是'wb')。 – matt2605

+0

您是否尝试过“ab”模式? –

+0

是的,我已经试过'ab',然后再次尝试,但是我得到的结果毫无意义。例如,如果我选择了10个列表,则只添加列表3。即使在打印时,1,2,4,5等也没有痕迹。 – matt2605

1

可以eval -uate字符串作为Python表达式:

>>> s = "[1, 2, 3, 4]" 
>>> l = eval(s) 
>>> l 
[1, 2, 3, 4] 
+0

这很好,谢谢,但是当我应用[“[1,2,3,4]”]时,会出现错误。 – matt2605

+0

您必须在一刻评估一个字符串:'[在您的列表中评估s]。 – dlask

0

一旦你的目录列表,使用任何方法后删除引号。

[9, 8, 6, 1, 3, 2, 4, 5, 7] 

同样,对于

m = [(4, 8, 16, 29), (4, 8, 16, 30), (4, 8, 16, 32)] 
reduce(lambda x,y: x+y,m) 

:您可以在下面的listsllist和 'M'

l = [[9,8,6],[1,3,2], [4], [5,7]] 
reduce(lambda x,y: x+y,l) 

成果转化为转向名单列表变为扁平list使用lambda结果为:

(4, 8, 16, 29, 4, 8, 16, 30, 4, 8, 16, 32) 
+0

谢谢,但删除引号正是我卡住了。 – matt2605

+0

您是否尝试过Anand和dlask的其他答案中的代码 – Nirmal

相关问题