2010-08-27 35 views
8

我有一個程序輸出一些我想存儲以便稍後使用的列表。例如,假設它輸出學生姓名列表和他們的中期分數的另一個列表。我可以存儲這個輸出在以下兩個方面:Pickle vs輸出到Python中的文件

標準文件輸出方式:

newFile = open('trialWrite1.py','w') 
newFile.write(str(firstNames)) 
newFile.write(str(midterm1Scores)) 
newFile.close() 

鹹菜方式:

newFile = open('trialWrite2.txt','w') 
cPickle.dump(firstNames, newFile) 
cPickle.dump(midterm1Scores, newFile) 
newFile.close() 

哪種技術更好地或首選?使用一個優勢是否有優勢?

感謝

回答

3

pickle是更通用的 - 它可以讓你對許多不同類型的對象轉儲到供以後使用的文件。缺點是臨時存儲空間不夠人性化,而不是標準格式。

另一方面,將字符串寫入文件對於其他活動或代碼來說是一個更好的接口。但它的代價是不得不再次將文本解析到Python對象中。

對於這個簡單的(list?)數據,兩者都很好;我會使用write(firstNames),因爲沒有必要使用泡菜。一般來說,如何將數據保存到文件系統取決於數據!


例如,pickle會很樂意鹹菜功能,你不能簡單地寫字符串表示做。

>>> data = range 
<class 'range'> 
>>> pickle.dump(data, foo) 
# stuff 
>>> pickle.load(open(..., "rb")) 
<class 'range'. 
+4

'pickle'並沒有像你想象的那樣精確地調用函數和類 - (http://docs.python.org/library/pickle.html#what-c​​an-be-pickled-and-unpickled)「注意那些函數(內置的和用戶定義的)被「完全限定的」名稱引用醃製,而不是由值......「在這種情況下,持久性依賴於穩定的模塊層次結構和接口,因爲取消環境必須與酸洗環境相匹配。 – 2010-08-27 22:09:54

+0

感謝您的回覆。我會按照David的建議寫字符串表示或使用CSV。 – Curious2learn 2010-08-28 00:43:00

+0

@Jeremy:我沒有意識到'pickle'不喜歡用戶定義的函數 - 謝謝! – katrielalex 2010-08-28 00:48:25

4

我覺得csv模塊可能是一個不錯的選擇這裏,因爲CSV是可以讀取和被Python(以及其它語言)編寫的標準格式,它也是人類可讀。使用可能很簡單

with open('trialWrite1.py','wb') as fileobj: 
    newFile = csv.writer(fileobj) 
    newFile.writerow(firstNames) 
    newFile.writerow(midterm1Scores) 

但是,每行寫一個學生,包括他們的名字和分數,可能會更有意義。可以這樣做:

from itertools import izip 
with open('trialWrite1.py','wb') as fileobj: 
    newFile = csv.writer(fileobj) 
    for row in izip(firstNames, midterm1Scores): 
     newFile.writerow(row) 
+0

我認爲'writerow'預計一個元組不是一個字符串集合。 – katrielalex 2010-08-27 21:01:25

+1

根據文檔,它會採取任何順序,包括列表或元組。 – 2010-08-28 00:22:59

+0

如果我使用'newFile.close()'這一行,我得到一個錯誤,說''_csv.writer'對象沒有屬性'close'「 – Curious2learn 2010-08-28 00:41:49

0

對於完全不同的方法,請考慮Python ships with SQLite。您可以將數據存儲在SQL數據庫中,而無需添加任何第三方依賴項。

+0

我需要使用這些數據來繪製matplotlib圖。我可以從SQlite導入,但似乎太多的工作來導出和導入它。 – Curious2learn 2010-08-28 00:44:17