【问题标题】:Read zip file in python3 same like python2在 python3 中读取 zip 文件,与 python2 相同
【发布时间】:2019-03-12 07:34:23
【问题描述】:

我将以下代码保存在 1 个文件中。假设read_zipfile.py

with open("demo.zip", "rb") as f:
    read_data = f.read()
    print (read_data) 

python2 给出以下输出:

[harsha@os]$ python2 read_zipfile.py
PK�flNdemo/PK
�flN����demo/hello.txtThi is Hello file
PK
�KK
   demo/hi.txtPK?�flN$��Ademo/
 �m@Q���^;T����m@Q���PK?
�flN����$ ���#demo/hello.txt
 �m@Q����m@Q����m@Q���PK?
�KK
   $ ���ademo/hi.txt
 ���B�������,���PK�

python3 给出以下输出:

[harsha@os]$ python3 read_zipfile.py
    b'PK\x03\x04\x14\x03\x00\x00\x00\x00\x88flN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00demo/PK\x03\x04\n\x03\x00\x00\x00\x00\x88flN\x83\x9d\xd9\xc9\x12\x00\x00\x00\x12\x00\x00\x00\x0e\x00\x00\x00demo/hello.txtThi is Hello file\nPK\x03\x04\n\x03\x00\x00\x00\x00\xf0\x18KK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00demo/hi.txtPK\x01\x02?\x03\x14\x03\x00\x00\x00\x00\x88flN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00$\x00\x00\x00\x00\x00\x00\x00\x10\x80\xedA\x00\x00\x00\x00demo/\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00\x80m@Q\xa4\xd8\xd4\x01\x00^;T\xa4\xd8\xd4\x01\x80m@Q\xa4\xd8\xd4\x01PK\x01\x02?\x03\n\x03\x00\x00\x00\x00\x88flN\x83\x9d\xd9\xc9\x12\x00\x00\x00\x12\x00\x00\x00\x0e\x00$\x00\x00\x00\x00\x00\x00\x00 \x80\xa4\x81#\x00\x00\x00demo/hello.txt\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00\x80m@Q\xa4\xd8\xd4\x01\x80m@Q\xa4\xd8\xd4\x01\x80m@Q\xa4\xd8\xd4\x01PK\x01\x02?\x03\n\x03\x00\x00\x00\x00\xf0\x18KK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00$\x00\x00\x00\x00\x00\x00\x00 \x80\xa4\x81a\x00\x00\x00demo/hi.txt\n\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00\x00\xb6\x96\xfa\x0fB\xd3\x01\x80\xd0\xd6\x16\xa4\xd8\xd4\x01\x00,\x17\x0f\xa4\xd8\xd4\x01PK\x05\x06\x00\x00\x00\x00\x03\x00\x03\x00\x14\x01\x00\x00\x8a\x00\x00\x00\x00\x00'

如何使用 python3 获取 python2 输出格式?

【问题讨论】:

  • 这是完全相同的数据,只是打印方式不同。你在这里的目标是什么?为什么要打印 zip 文件的二进制表示形式?
  • @Aran-Fey 我希望在 python3 中像 python2 一样打印数据
  • @Aran-Fey :我可以将 python3 输出转换为 python2 格式吗?
  • @Aran-Fey Python3 以字节格式给我。我想要使​​用 python3 输出 python2。
  • Harsha Biyani:你为什么要在 .zip 文件中打印二进制数据?

标签: python python-3.x python-2.7 unicode byte


【解决方案1】:

在python3中,f.read()返回一个字节, 你应该选择一个编码,比如 utf-8 并将其转换为 str。

然后会像python2一样打印出来。

with open("demo.zip", "rb") as f:
    read_data = f.read()
    #print (read_data) 
    s = read_data.decode('latin1')
    print(s)

【讨论】:

  • 我试过这个。这与 Python2 输出的格式不同
  • 这取决于,你的控制台使用的实际解码是什么,它可能不是 utf-8
  • @martineau:非常感谢您的帮助。 latin1 帮我解决了问题。你能补充一下答案吗?这样我也能接受。
  • @Harsha Biyani:没必要。我建议您接受这个包含答案本质的内容。
  • @HarshaBiyani:顺便说一句,在 Python 3 中使用latin1 编码存储二进制数据是一种“技巧”。有关相关问题,请参阅this answer
【解决方案2】:

为了在 Python 3 中将原始字节转储到 STDOUT,请使用底层的二进制流 sys.stdout。 它可以作为.buffer 属性访问。

print(read_data) 更改为

sys.stdout.buffer.write(read_data)
sys.stdout.buffer.write(b'\n')

如果你想完全模仿 print 所做的事情,最后一行是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2017-07-07
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多