将Base64编码的字符串解码并写入文件

15

问题是如何将解码自Base64的字符串写入文件?我使用了下面的代码:

import base64

input_file = open('Input.txt', 'r')
coded_string = input_file.read()
decoded = base64.b64decode(coded_string)
output_file = open('Output.txt', 'w')
output_file.write(decoded)
output_file.close()

Input.txt 包含Base64字符串(类似于PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cmV2aW)。执行脚本后,我希望在Output.txt中看到xml,但输出文件包含一些错误符号(例如<?xml version="1.0" encoding="UTF-8"?><review-case create®vFFSТ#2)。同时,如果我不从Input.txt文件中读取Base64字符串,而是在脚本中指定它为coded_string = '''PD94bWwgdmVyc2lvbj0iMS4wIiBlbm...''',那么Output.txt包含正确的xml。这是UTF编码出了问题吗?如何解决?我的操作系统是Windows 7,使用Python2.7。提前致谢。


顺便说一下,在我的Ubuntu上它的行为也是一样的。 - olyv
2个回答

12
您可能已经知道了,5年后的现在,但如果有人需要,这里是解决方案。
import base64

with open('Input.txt', 'r') as input_file:
  coded_string = input_file.read()
decoded = base64.b64decode(coded_string)
with open('Output.txt', 'w', encoding="utf-8") as output_file:
  output_file.write(decoded.decode("utf-8"))

我没有时间忘记这个问题,但我很感激你的答案。 - olyv

2
在Windows中,你需要用'rb'来打开文件,而不是'r'。
在你的情况下,你的代码应该是:
input_file = open('Input.txt', 'rb')

代替,而不是
input_file = open('Input.txt', 'r')

btw: http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files

在Windows操作系统上,追加'b'到文件打开模式中会以二进制模式打开文件,因此还有像'rb'、'wb'和'r+b'这样的模式。Python在Windows上区分文本文件和二进制文件;当读取或写入数据时,文本文件中的换行符自动略微改变。这种对文件数据的幕后修改对ASCII文本文件来说是可以接受的,但对于像JPEG或EXE文件中的二进制数据来说,它会破坏数据。在读写这些文件时一定要非常小心地使用二进制模式。在Unix上,追加'b'到模式中不会有影响,因此您可以在所有二进制文件上平台无关地使用它。希望这有所帮助。

谢谢。我尝试使用rb模式,但似乎并不是解决方案。结果仍然相同。 - olyv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接