Python base64.decode 在Windows上似乎不起作用

1 投票
1 回答
3074 浏览
提问于 2025-04-16 00:34

我正在使用一个网络服务(用Java写的),这个服务基本上返回一个字节数组(在SOAP中相当于经过base64编码的二进制数据)。

我在使用Python的suds库,下面的代码在我的Mac上运行得很好(在Windows的Cygwin环境下也可以),但是在普通的Windows上(Python 2.6.5)解码却不成功。我主要是做Java开发的,所以任何帮助都非常感谢。

from suds.client import Client
import base64,os,shutil,tarfile,StringIO

u = "user"
p = "password"

url = "https://xxxx/?wsdl"

client = Client(url, username=u, password=p)

bin =  client.service.getTargz("test")

f = open("tools.tar.gz", "w")

f.write(base64.b64decode(bin.encode('ASCII')))

f.close()

print "finished writing"

tarfile.open("tools.tar.gz").extractall()

在Mac上运行得很好,但在Windows上却出现了这个错误:

C:\client>python client.py
xml
Getting the sysprep file from the webservice
finished writing
Traceback (most recent call last):
  File "client.py", line 28, in 
    tarfile.open("tools.tar.gz").extractall()
  File "C:\Python26\lib\tarfile.py", line 1653, in open
    return func(name, "r", fileobj, **kwargs)
  File "C:\Python26\lib\tarfile.py", line 1720, in gzopen
    **kwargs)
  File "C:\Python26\lib\tarfile.py", line 1698, in taropen
    return cls(name, mode, fileobj, **kwargs)
  File "C:\Python26\lib\tarfile.py", line 1571, in __init__
    self.firstmember = self.next()
  File "C:\Python26\lib\tarfile.py", line 2317, in next
    tarinfo = self.tarinfo.fromtarfile(self)
  File "C:\Python26\lib\tarfile.py", line 1235, in fromtarfile
    buf = tarfile.fileobj.read(BLOCKSIZE)
  File "C:\Python26\lib\gzip.py", line 219, in read
    self._read(readsize)
  File "C:\Python26\lib\gzip.py", line 271, in _read
    uncompress = self.decompress.decompress(buf)
zlib.error: Error -3 while decompressing: invalid distance too far back

1 个回答

7

尝试一下

f = open("tools.tar.gz", "wb")

告诉Python这是一个二进制文件是非常重要的(在Python 3中,这在类Unix系统上也变得很重要,但在Python 2中在这些系统上并不是严格需要的,这就是为什么你的代码在MacOSX上能正常工作):默认情况下,Python认为你要处理的是文本文件,而在Windows系统上,写入的每个\n会在磁盘上变成\r\n

撰写回答