【问题标题】:Python: TypeError: 'str' does not support the buffer interface [duplicate]Python:TypeError:'str'不支持缓冲区接口[重复]
【发布时间】:2016-04-28 09:16:54
【问题描述】:

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

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

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')

【问题讨论】:

  • 在转换成str时出现问题,你知道可以使用format来格式化字符串吗?
  • 如果我知道解决方案永远不会打扰...
  • 尝试将byte放在字符串前面,请使用format:f.write(b"{0} {1} {2} {3} {4} {5} { 6}\n".format(str(ndh[i]),str(ncoordx[i]),str(ncoordy[i]),str(nelev[i]),str(nbit[i]),str( nfines[i]), str(nfac[i]))
  • @minitoto:bytes 类型故意在 Python 3 中没有 format 方法(在 Python 2 中确实如此,但这只是因为 bytesstr 的别名)。
  • 我怎么知道 op 使用哪个版本

标签: python string save spyder


【解决方案1】:

这是一个 Python 3 问题,与 Python 3 中的 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 调用更简洁地表达大字符串连接,但这与编码问题无关。)

【讨论】:

  • 反对票有什么解释吗?
  • 为什么我们不能投票选出最佳答案?我非常感谢 Blknght!
猜你喜欢
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多