2015-06-20 133 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

相關問題