2013-06-20 119 views
32

這是一個有點奇怪的請求,但我正在尋找一種方法來寫一個列表到文件,然後再讀一遍。Python 2.7 - 從文件中讀取和讀取一個列表

我無法重新制作列表,以便它們按照下面的示例正確地形成/格式化。

我的列表有類似如下的數據:

test 
data 
here 
this 
is one 
group :) 

test 
data 
here 
this 
is another 
group :) 

回答

92

如果你不需要它是人類可讀/可編輯的,最簡單的解決方法就是使用pickle

這樣寫:

with open(the_filename, 'wb') as f: 
    pickle.dump(my_list, f) 

閱讀:

with open(the_filename, 'rb') as f: 
    my_list = pickle.load(f) 

如果需要它們是人類可讀的,我們需要更多的信息。

如果my_list保證是沒有內嵌換行符的字符串列表,只寫他們每行一個:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write(s + '\n') 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip('\n') for line in f] 

如果他們是Unicode字符串,而不是字節串,你會想要encode他們。 (或者更糟糕的是,如果它們是字節字符串,但不一定與系統默認的編碼相同)。

如果它們可能有換行符或不可打印字符等,則可以使用轉義或引用。 Python在stdlib中內置了各種各樣的轉義類型。

讓我們用unicode-escape這裏,可以同時解決上述兩個問題:

with open(the_filename, 'w') as f: 
    for s in my_list: 
     f.write((s + u'\n').encode('unicode-escape')) 

with open(the_filename, 'r') as f: 
    my_list = [line.decode('unicode-escape').rstrip(u'\n') for line in f] 

您還可以使用在2.x的3.x的風格的解決方案,無論是codecs模塊或在io模塊:*

import io 

with io.open(the_filename, 'w', encoding='unicode-escape') as f: 
    f.writelines(line + u'\n' for line in my_list) 

with open(the_filename, 'r') as f: 
    my_list = [line.rstrip(u'\n') for line in f] 

* TOOWTDI,所以這是一個顯而易見的方法是什麼?它取決於...對於簡短版本:如果您需要在2.6之前使用Python版本,請使用codecs;如果沒有,請使用io

+0

我喜歡鹹菜庫,這是非常甜蜜的,完美的作品。我已經實現了它,它似乎工作正常。 謝謝,只要它允許,我會立即將您標記爲綠色勾號。 – Ryflex

+0

unicode-escape ...由於TypeError,我必須打開它爲'wb':必須是str,而不是字節 – rluks

+0

@Pan.student:您使用的是Python 3.x,對不對?在Python 2中,這是這個問題提出的問題,'str'和'bytes'是相同的類型,二進制文件和文本文件之間的區別僅僅是換行。在Python 3中,'str'和'unicode'是相同的類型,二進制文件和文本文件的區別在於文本文件會自動爲您編碼和解碼。 (如果你小心的話,如果是2.x,你可以得到類似3.x的行爲,包括帶有'io.open'的3.x-style文本文件,但提問者沒有這樣做。) – abarnert

12

只要你的文件有一致的格式(即換行符),這很容易,只需基本的文件IO和字符串操作:

with open('my_file.txt', 'rU') as in_file: 
    data = in_file.read().split('\n') 

這將您的數據文件存儲爲項目的列表,每行一個。然後將其放入一個文件,你會做相反的:

with open('new_file.txt', 'w') as out_file: 
    out_file.write('\n'.join(data)) # This will create a string with all of the items in data separated by new-line characters 

希望這適合你在找什麼。

+0

+1。如果我們談論的數據不是很複雜,恕我直言,最好是在這個答案中推出自己的解析器。 – brokenfoot