Python base64每行72个字符

时间:2013-08-26 23:19:04

标签: python base64 line

如何在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

2 个答案:

答案 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这样的函数只能对你只调用一次的全局变量做一些事情并没有帮助,因为它不再仅仅是运行代码内联的可重用性。如果您希望它可重用(并且可调试等),请使用参数。如果您不需要它可以重复使用,只需将其写入内联即可。