2011-11-24 134 views
5

我想读取文件并将其写回。这里是我的代码:阅读压缩文件并将其写入其他文件python

file = open(zipname , 'r') 
    content = file.read() 
    file.close() 

    alt = open('x.zip', 'w') 
    alt.write(content) 
    alt.close() 

这不起作用,为什么?????

编辑:

重写的文件已损坏 (在Windows蟒蛇2.7.1)

回答

9

读取和二进制模式, 'RB' 和 'WB' 写:

f = open(zipname , 'rb') 
content = f.read() 
f.close() 

alt = open('x.zip', 'wb') 
alt.write(content) 
alt.close() 

文本模式在Windows上不起作用的原因是从'\ r \ n'到'\ r'的换行符翻译了压缩文件中的二进制数据。

+1

感谢你们,当我试图上传Zipfile到Dropbox(在Windows上,OSX很好)时,我疯了。 –

1

如果我在我的OS X或Linux机器上运行此程序,它的工作原理与您的预期完全相同。文件x.zip与原始zip文件具有完全相同的校验和,并且没有损坏。我相信Windows是需要以二进制模式显式打开文件的平台之一;尝试:

file = open(zipname, 'rb') 
6

this bit of the manual

在Windows中, 'B' 附加到模式打开文件以二进制模式,所以 也有模式,如 'RB', 'WB',和'r + b'。 Windows上的Python 区分了文本和二进制文件;在读取或写入数据 时,文本文件末尾的 字符会稍微自动更改。这种对文件数据 的后台修改对于ASCII文本文件来说很好,但它会破坏JPEG或EXE文件中的 这样的二进制数据。当读取 并编写这些文件时,请非常小心地使用二进制模式。在Unix上,将模式追加'b'并不会伤害到该模式,因此您可以在所有二进制 文件中独立使用它。

+1

+1为高质量参考:-) –

+2

Python 3变得更糟。在Python 3中,编码在读/写时应用,所有字符串都是Unicode。简单的讲话:在所有平台上,不仅仅是线路结局可以改变。这意味着当所有平台上的文件都是二进制文件时,人们需要标记文件,否则他们将花费更多的时间移植到Python 3。 – yam655

相关问题