如何在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 :(得分:2)
def organize():
return "\n".join(split_len(file, 72))
应该返回一个write
期待的字符串
在旁注上可能更好做
with open(filename,"w") as f:
f.write(organize())
因为这样可以确保文件在完成后关闭(尽管你的版本可能会很快收集垃圾)
答案 1 :(得分: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
函数试图解决这个问题...但它实际上没有返回任何内容,它只打印出一堆东西,所以实际传递给write
的是默认返回价值None
。
无论如何,你需要实际积累价值。你可以明确地说明:
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
这样的函数只能对你只调用一次的全局变量做一些事情并没有帮助,因为它不再仅仅是运行代码内联的可重用性。如果您希望它可重用(并且可调试等),请使用参数。如果您不需要它可以重复使用,只需将其写入内联即可。