2013-08-26 20 views
0

如何在base64中編碼二進制文件,每行有72個字符?Python base64 72行每行

這是我試過的,但它不工作,我不知道我是否正確格式化輸出,以便它可以解碼。

import base64 

fin = open("/Users/kyle/one_time_pad/encrypt/cipher_text.txt", "rb") 
binary_data = fin.read() 
fin.close() 

b64_data = base64.b64encode(binary_data) 
file = b64_data 

def split_len(seq, length): 
    return [seq[i:i+length] for i in range(0, len(seq), length)] 

def organize(): 
    for a in split_len(file, 72): 
     print a 

open("/Users/kyle/Desktop/test.txt", "w").write(organize()) 

它給人的錯誤TypeError: expected a character buffer object

+0

未來,請不要只引用錯誤,告訴我們錯誤發生的地方。 (最簡單的方法是引用整個回溯。) – abarnert

回答

2

在試圖重新實現輪子之前,總是需要瀏覽stdlib。該textwrap模塊非常適合這個目的:

file = b64_data 
file72 = textwrap.fill(b64_data, 72) 
open("/Users/kyle/Desktop/test.txt", "w").write(file72) 

有兩件事情錯了你現有的代碼。

首先,您將從split_len創建一個字符串列表,但試圖將其寫成單個字符串與write

其次,你的organize函數試圖解決這個問題...但它實際上不返回任何東西,它只是打印出一堆東西,所以什麼是真正被傳遞給了writeNone默認返回值。

無論如何,你需要實際上積累的價值成東西。你可以到明確:

def organize(f): 
    result = '' 
    for a in split_len(f, 72): 
     if result: result += '\n' 
     result += a 

...或者你可以再次求助於包括電池和尋找那些已經這樣做了一個功能:

def organize(f): 
    return '\n'.join(f) 

或者,你可以只是做了write各一次通過循環時間:

with open("/Users/kyle/Desktop/test.txt", "w") as f: 
    for a in split_len(file, 72): 
     f.write(a + '\n') 

或者你可以把它作爲一個列表,並調用writelines與名單(但你必須改變split_len因此它在每行的末尾添加了\n,或者致電writelines瞭解這一點的理解)。


一些旁註:

你應該總是關閉您的文件,當您打開它們,並使用with語句也可以簡化:

with open("/Users/kyle/Desktop/test.txt", "w") as f: 
    f.write(file72) 

在一般情況下,像一個功能你organize只對一個全局變量做些什麼,你只需要調用一次就沒有任何幫助,因爲它不僅僅是內聯代碼的可重用。如果你希望它是可重用的(和可調試等),讓它有一個參數。如果你不需要它是可重用的,就直接寫入它。

2
def organize(): 
    return "\n".join(split_len(file, 72)) 

應該返回一個字符串,它是什麼write期待

上側

注意它可能是更好的做

with open(filename,"w") as f: 
     f.write(organize()) 

因爲這將確保該文件完成後關閉(儘管tbh您的版本可能會相當快地收集垃圾)

+1

'a in foo'不是有效的生成器表達式。如果你的意思是'a for a foo',這是有效的,但是它和使用'foo'一樣。所以目前還不清楚你在這裏做什麼。 – abarnert

+0

哇我一定很累:P –