2014-03-18 59 views
0

我正在嘗試使用此示例調試較大的音頻項目。我加載一個mp3文件,base64編碼它,解碼,然後保存到磁盤。只有生成的文件是不是都在那裏,即使以base64版本看起來是一樣的:將base64編碼文件保存到磁盤時丟失數據

import base64 
with open('/Users/Public/Music/119-the_killers-spaceman.mp3') as f: 
mp3 = f.read() 
>>> len(mp3) 
1435 
>>> b64 = base64.b64encode(mp3) 
>>> len(b64) 
1916 #I expect it to become 25% larger when encoded. 
>>> MP3 = base64.b64decode(b64) 
>>> f.close() 
>>> F = open('test.mp3','wb') 
>>> F.write(MP3) 
>>> F.close() 
>>> len(MP3) 
1435 

數據是一樣的:

>>> MP3[:100] 
'ID3\x03\x00\x00\x00\x00\x05GTRCK\x00\x00\x00\x06\x00\x00\x0019/24TIT2\x00\x00\x00\t\x00\x00\x00SpacemanTPE1\x00\x00\x00\x0c\x00\x00\x00The KillersTALB\x00\x00\x00\x1b\x00\x00\x00Funky New Year 2009: I' 
>>> mp3[:100] 
'ID3\x03\x00\x00\x00\x00\x05GTRCK\x00\x00\x00\x06\x00\x00\x0019/24TIT2\x00\x00\x00\t\x00\x00\x00SpacemanTPE1\x00\x00\x00\x0c\x00\x00\x00The KillersTALB\x00\x00\x00\x1b\x00\x00\x00Funky New Year 2009: I' 

實際文件:2K,不2.5MB。

我在做什麼錯?並希望這可以解釋爲什麼我保存發送到我的服務器的base64編碼的WAV文件的問題。

+0

的問題是,你的初始'read'只返回的第一個1435個字節2.5MB的文件。 –

+0

我該如何解決這個問題? –

回答

0

我猜這是在Windows上。當您在文本模式下打開文件時,Windows有一個有趣的屬性,它在第一個遇到的Ctrl-Z(\x1a)字符處停止。任何壓縮文件將看起來像是一個隨機的字節序列,這意味着該值必定會在文件的早期發生。

以二進制方式打開文件:

with open('/Users/Public/Music/119-the_killers-spaceman.mp3', 'rb') as f: 
+0

工作!作爲f:格式毀了它再次... –

+0

與開放('/ Users/Public/Music/119-the_killers-spaceman.mp3')作爲f: \t mp3 = f.read() \t >>> LEN(MP3) >>>具有開放( '/用戶/公共/音樂/ 119-the_killers-spaceman.mp3', 'RB')爲f: \t MP3 = f.read( )\t >>> LEN(MP3) >>> B64 = base64.b64encode(MP3) >>> MP3 = base64.b64decode(B64) >>> F =開放( '請將test.mp3', 'wb') >>> f.write(MP3) >>> f.close() 文件正確無誤 –