2013-03-05 181 views
1

我正在處理二進制文件。它們是jpeg圖像。 我需要用Python編輯它們並保存它們。 我一直在使用這個腳本,並且似乎正常工作爲止:寫入文件夾時文件更改

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= open (newpath+ '/preview.BINARY', 'w') 

# do my edits in a secon time... 

out.write (edit_data) 
data.close() 
out.close() 

無論如何,出了問題(出的Python)arised:我的兩個文件都應該是一樣的,但他們都沒有!通過在一個十六進制編輯器中打開他們,他們看起來有些不同(原始文件比新文件更小,即163KB,agaist 167)。 此外,當我打開它們時,它們是不同的。他們仍然被視爲圖像,但一看起來很好(原來的),而另一個是完全混亂... 出了什麼問題?我正在使用的代碼是否改變了我不知道的東西,如果是的話,是什麼? 我希望你能幫助我。

+1

爲什麼你希望這兩個文件是一樣的嗎?你打開一個文件,徹底改變它,然後保存它 - 當然它會有所不同。 – danodonovan 2013-03-05 11:23:06

回答

2

你不說你做的

# do my edits in a secon time...

但姑且不論,行

edit_data= str (data.read()) 

將相當徹底改變你的數據。你正在打開一個二進制文件,將內容轉換爲一個字符串,然後將內容保存到一個不同的文件中,這樣就會變爲

edit_data = data.read() 

更改爲上面會解決您所提供的片斷,但如果你正在編輯的數據在其他地方這也改變的事情。

建議

如果你將要編輯二進制文件很多,可能是使用with語法

with open(my_file, 'rb+') as fo: 
    edit_data = fo.read() 

,然後你不必是個好主意擔心關閉文件等。一旦你有edit_data,這將是再次保存數據

with open(my_out_file, 'wb') as fo: 
    fo.write(edit_data) 

更清潔和更簡單之前,你可以就地編輯字節數組!

+0

感謝您指點。關於編輯的評論意味着我沒有做任何實際的事情,只是嘗試將原始文件寫入文件夾。無論如何,我想將它轉換爲字符串,因爲編輯它會容易得多,我是編程人員的新手。你的方法給了我正確的結果,所以謝謝,我現在猜測如果我可以編輯這些二進制文件就像編輯字符串一樣簡單,但我會嘗試管理它。再次感謝。 – umbe1987 2013-03-05 11:32:42

+0

在Python 2.x中,file.read()已經返回一個'str'。 – 2013-03-05 11:49:10

+0

非常感謝你,這應該是完美的我的目的! – umbe1987 2013-03-05 12:22:26

2

使用二進制模式:

open (newpath+ '/preview.BINARY', 'wb') 
+0

你說得對,謝謝你! – umbe1987 2013-03-05 12:22:42