Python:TypeError:'str'不支持缓冲区接口

时间:2016-01-21 22:16:54

标签: python string save spyder

我在这里做错了什么?请提出任何建议。感谢

我正在尝试写出我的数据,但它一直给我一个错误。这是我的代码:

with open(output,'wb') as f:

    f.write(b'Apple Data\n7\nApple Number\nE, m\nN, m\nE, m\nB, percent\nF, percent\nFa Code\n')
    for i in range(new_ndata):
        f.write(str(nn[i])+' '+str(x[i])+' '+str(y[i])+' '+str(n[i])+' '+str(nb[i])+' '+str(nf[i])+' '+str(nfa[i])+'\n')

1 个答案:

答案 0 :(得分:0)

这是一个Python 3问题,与Python 3(与Python 2不同)的方式有关,str类型是Unicode,而不是编码字节。

您的第一个write调用正确传递了bytes个实例(引用字符串上的b前缀会将其删除)。但是,你的第二个调用会传递一个str实例(从一堆较小的字符串连接起来)。

在将字符串写入二进制文件之前,需要将该字符串编码为字节。或者,以文本模式打开文件,让它为您编码字符串,这需要更改第一个write以发送字符串,而不是预编码bytes。)

对于前者,尝试类似:

f.write((str(ndh[i])+' '+str(ncoordx[i])+' '+str(ncoordy[i])+' '+
         str(nelev[i])+' '+str(nbit[i])+' '+str(nfines[i])+' '+
         str(nfac[i])+'\n').encode("utf-8"))

额外的一点是最后一点,所以我把线条包裹在几个方便的位置(允许在括号内的表达式中)。我在某种程度上随意挑选了"utf-8"编码。您可能希望使用不同的东西(例如ASCII或许多其他可用编码之一)。并非所有编码都可以编码所有Unicode字符串。 (您也可以通过单个str.format调用更简洁地表达大字符串连接,但这与编码问题无关。)