Python3写gzip文件 - memoryview:需要一个类似字节的对象,而不是'str'

时间:2016-12-02 00:31:16

标签: python gzip typeerror python-3.5

我想写一个文件。根据文件名,可以使用gzip模块压缩也可以不压缩。这是我的代码:

import gzip
filename = 'output.gz'
opener = gzip.open if filename.endswith('.gz') else open
with opener(filename, 'wb') as fd:
    print('blah blah blah'.encode(), file=fd)

我正在以二进制模式打开可写文件并编码要写入的字符串。但是我收到以下错误:

File "/usr/lib/python3.5/gzip.py", line 258, in write
  data = memoryview(data)
TypeError: memoryview: a bytes-like object is required, not 'str'

为什么我的对象不是字节?如果我用'w'打开文件并跳过编码步骤,我会收到同样的错误。如果我从文件名中删除'.gz',我也会收到同样的错误。

我在Ubuntu 16.04上使用Python3.5

4 个答案:

答案 0 :(得分:7)

你可以把它转换成这样的字节。

import gzip 
with gzip.open(filename, 'wb') as fd:
   fd.write('blah blah blah'.encode('utf-8'))

答案 1 :(得分:4)

print是一个相对复杂的功能。它将str写入文件,但不写入您传递的str,它会写入str,这是渲染参数的结果。

如果您已经有字节,可以直接使用fd.write(bytes),如果需要,可以添加换行符。

如果您没有字节,请确保已打开fd以接收文字。

答案 2 :(得分:2)

对我来说,将gzip标志更改为'wt'即可完成工作。我可以写原始的字符串,而无需“ byting”它。 (在ubuntu 16上的python 3.5、3.7上进行了测试)。

python 3 gzip doc-引用:“ ...模式参数可以是'r','rb','a','ab','w','wb','x'中的任何一个或“ xb”表示二进制模式,或“ rt”,“ at”,“ wt”或“ xt”表示文本模式 ...”

import gzip

filename = 'output.gz'
opener = gzip.open if filename.endswith('.gz') else open
with opener(filename, 'wt') as fd:
    print('blah blah blah', file=fd)

!zcat output.gz
> blah blah blah

答案 3 :(得分:0)

您可以使用pickle对其进行序列化。

首先将object序列化为使用pickle进行写入,然后使用gzip

保存 object

import gzip, pickle
filename = 'non-serialize_object.zip'
# serialize the object    
serialized_obj = pickle.dumps(object)
# writing zip file
with gzip.open(filename, 'wb') as f:
   f.write(serialized_obj)

加载 object

import gzip, pickle
filename = 'non-serialize_object.zip'

with gzip.open(filename, 'rb') as f:    
   serialized_obj = f.read()
# de-serialize the object
object = pickle.loads(serialized_obj)