2016-12-02 100 views
5

我想写一个文件。根据文件的名称,可能会或可能不会使用gzip模块进行压缩。这里是我的代码:Python3写gzip文件 - memoryview:需要一个类似字节的对象,而不是'str'

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',我也会得到同样的错误。

我使用Python3.5在Ubuntu 16.04

+1

它与print(str('blah blah blah'.encode()),file = fd)'一样。 python试图写入bytes对象的字符串表示。 – tdelaney

回答

4

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

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

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

+0

使用'fd.write(b“blah blah blah”)' –

+0

@citizenSNIPS,我不明白你的意见。 – Javier

+0

添加一个'b'infront的str来表示它是一个字节。我相信你想传递一个字节字面量。 [](https://www.python.org/dev/peps/pep-3112/) –

2

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

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