我想写一个文件。根据文件名,可以使用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
答案 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)