2013-08-26 50 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 –