2013-03-04 107 views
-1

一個二進制文件,我想知道Python編程的一個很基本的東西,因爲我是一個很基本的程序員現在):我怎麼能保存的結果(無論是列表,字符串,或任何)到Python中的文件? 我一直在尋找很多,但我找不到任何好的答案。 我正在考慮「.write()」方法,但(例如)它似乎不適用於字符串,我也不知道它應該做什麼。 所以,我的情況是我有二進制文件,我想編輯,因此我發現很容易將它們轉換爲字符串,修改它們,現在我想將它們保存到i)回到二進制文件(jpegs圖像)和ii)在我想要的文件夾中。 我該怎麼做?請我需要一些幫助。保存字符串在Python

UPDATE

這裏是我試圖運行腳本:

import os, sys 

newpath= r'C:/Users/Umberto/Desktop/temporary' 
if not os.path.exists (newpath): 
    os.makedirs (newpath) 

data= open ('C:/Users/Umberto/Desktop/Prove_Script/Varie/_BR_Browse.001_2065642654_1.BINARY', 'rb+') 
edit_data= str (data.read()) 
out_dir= os.path.join (newpath, 'feed', 'address') 

data.close() 


# do my edits in a secon time... 

edit_data.write (newpath) 

edit_data.close() 

我得到的錯誤是:

AttributeError: 'str' object has no attribute 'write' 

UPDATE_2

我試圖使用泡菜模塊連載我的二進制文件,修改並保存到了最後,但還是沒有得到它的工作......這就是我一直在試圖至今:

import cPickle as pickle 
binary= open ('C:\Users\Umberto\Desktop\Prove_Script\Varie\_BR_Browse.001_2065642654_1.BINARY', 'rb') 
out= open ('C:\Users\Umberto\Desktop\Prove_Script\Varie\preview.txt', 'wb') 
pickle.dump (binary, out, 1) 

TypeError         Traceback (most recent call last) 
<ipython-input-6-981b17a6ad99> in <module>() 
----> 1 pprint.pprint (pickle.dump (binary, out, 1)) 

C:\Python27\ArcGIS10.1\lib\copy_reg.pyc in _reduce_ex(self, proto) 
    68  else: 
    69   if base is self.__class__: 
---> 70    raise TypeError, "can't pickle %s objects" % base.__name__ 
    71   state = base(self) 
    72  args = (self.__class__, base, state) 

TypeError: can't pickle file objects 

另一件事我沒有」不過,如果我應該創建一個文件來支持(在我的情況下,我必須創建「out」,否則我就沒有pickle方法的正確參數),或者沒有必要。 希望我正在接近解決方案。

PS:我也試圖與pickle.dumps(),沒有實現雖然更好的結果...

+0

'write'不能用字符串工作?無論如何,如果你想將列表等保存到一個文件中,最好使用[pickle](http://docs.python.org/2/library/pickle.html),但這與工作完全不同與JPEG或其他二進制文件 – 2013-03-04 15:40:00

+0

我會編輯我的問題,以便您可以看到我想要做什麼,即使我知道我使用'.write()'模塊的部分是完全錯誤的,因爲我仍然不知道不知道如何使用它... – umbe1987 2013-03-04 15:44:27

+0

你可以顯示你正在嘗試的代碼嗎?否則無法回答這個問題。 – 2013-03-04 15:45:05

回答

4

如果你打開一個二進制文件並保存另一個二進制文件,你可以做這樣的事情:

with open('file.jpg', 'rb') as jpgFile: 
    contents = jpgFile.read() 

contents = (some operations here) 

with open('file2.jpg', 'wb') as jpgFile: 
    jpgFile.write(contents) 

一些評論:

  • 'RB' 和 'WB' 的意思閱讀並分別以二進制方式寫。有關處理二進制文件時爲什麼推薦'b'的更多信息here
  • Python的with statement負責在退出塊時關閉文件。

如果您需要保存列表,字符串或其他對象,並稍後檢索它們,請使用pickle,正如其他人指出的那樣。

+0

我認爲如果您至少給出了一點解釋和/或文檔鏈接,這個答案會更好。我相信很多初學者會想知道「rb''和」wb''這兩個字符串的用途。 – 2013-03-04 15:48:15

+0

你說得對,我會編輯它並添加一些評論。 – 2013-03-04 15:49:03

+0

現在這是一個更好的答案。不錯的工作。 – 2013-03-04 16:10:46

0

您可以使用名爲「pickle」的標準python模塊。

你可以閱讀一下:pickle documentation

讀取和寫入任何數據結構會很容易

pickle.dump(obj, file_handler) # for serialize object to file 
pickle.load(file)    # for deserialize from file 

,或者您可以序列化到字符串:pickle.dumps(..)和負荷它:pickle.loads(...)

+0

我認爲我將在pickle模塊上創建文檔,因爲我的jpegs是二進制格式,當我嘗試按照您的建議運行腳本時,它會輸出一個錯誤,說「TypeError:必須是字符串或緩衝區,而不是文件」。不管怎樣,謝謝你! – umbe1987 2013-03-04 16:08:38

+0

當然你不能用pickle加載其他格式的數據。它們只加載用pickle.dump保存的文件,並以指定的格式存儲數據。你的第一個問題是「我怎樣才能保存和加載字符串和其他結構」 - 鹹菜是最簡單的方法 – Elephant 2013-03-04 16:19:42

+0

我沖掉了文檔,並試圖醃製我的文件,接收到一個錯誤。我正在更新我的問題,以便您知道我一直在嘗試的內容。 – umbe1987 2013-03-05 09:40:12