這是一個有點奇怪的請求,但我正在尋找一種方法來寫一個列表到文件,然後再讀一遍。Python 2.7 - 從文件中讀取和讀取一個列表
我無法重新制作列表,以便它們按照下面的示例正確地形成/格式化。
我的列表有類似如下的數據:
test
data
here
this
is one
group :)
test
data
here
this
is another
group :)
這是一個有點奇怪的請求,但我正在尋找一種方法來寫一個列表到文件,然後再讀一遍。Python 2.7 - 從文件中讀取和讀取一個列表
我無法重新制作列表,以便它們按照下面的示例正確地形成/格式化。
我的列表有類似如下的數據:
test
data
here
this
is one
group :)
test
data
here
this
is another
group :)
如果你不需要它是人類可讀/可編輯的,最簡單的解決方法就是使用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
。
只要你的文件有一致的格式(即換行符),這很容易,只需基本的文件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
希望這適合你在找什麼。
+1。如果我們談論的數據不是很複雜,恕我直言,最好是在這個答案中推出自己的解析器。 – brokenfoot
我喜歡鹹菜庫,這是非常甜蜜的,完美的作品。我已經實現了它,它似乎工作正常。 謝謝,只要它允許,我會立即將您標記爲綠色勾號。 – Ryflex
unicode-escape ...由於TypeError,我必須打開它爲'wb':必須是str,而不是字節 – rluks
@Pan.student:您使用的是Python 3.x,對不對?在Python 2中,這是這個問題提出的問題,'str'和'bytes'是相同的類型,二進制文件和文本文件之間的區別僅僅是換行。在Python 3中,'str'和'unicode'是相同的類型,二進制文件和文本文件的區別在於文本文件會自動爲您編碼和解碼。 (如果你小心的話,如果是2.x,你可以得到類似3.x的行爲,包括帶有'io.open'的3.x-style文本文件,但提問者沒有這樣做。) – abarnert