【问题标题】:Writing Strings to files in python在python中将字符串写入文件
【发布时间】:2011-01-30 12:26:27
【问题描述】:

尝试将字符串写入 pythion 中的文件时出现以下错误:

Traceback (most recent call last):
  File "export_off.py", line 264, in execute
    save_off(self.properties.path, context)
  File "export_off.py", line 244, in save_off
    primary.write(file)
  File "export_off.py", line 181, in write
    variable.write(file)
  File "export_off.py", line 118, in write
    file.write(self.value)
TypeError: must be bytes or buffer, not str

我基本上有一个字符串类,其中包含一个字符串:

class _off_str(object):
    __slots__ = 'value'
    def __init__(self, val=""):
        self.value=val

    def get_size(self):
        return SZ_SHORT

    def write(self,file):
        file.write(self.value)

    def __str__(self):
        return str(self.value)

此外,我这样调用该类(其中变量是 _off_str 对象的数组:

def write(self, file):
    for variable in self.variables:
        variable.write(file)

我不知道发生了什么。我见过其他 python 程序将字符串写入文件,为什么这个不能呢?

非常感谢您的帮助。

编辑:看来我需要说明我是如何打开文件的,方法如下:

file = open(filename, 'wb')
primary.write(file)
file.close()

【问题讨论】:

  • 我回答了你的问题,但我自己也有一个。为什么要在 Python 中编写自己的字符串类,而 Python 本身内置了几个非常强大的类?
  • 或者,更强烈地说。请不要发明自己的字符串类。这种事情使软件无法维护。
  • 我不想这样做,这只是包中其他文件的做法。最后,我同意你的看法,觉得真的很傻,直接撕了。我们会看看是否有人投诉。
  • "包中的其他文件?"你的意思是每个其他模块都发明了自己的字符串类?你在做什么?
  • blender 中的导出脚本。也可能只是我不理解他们。我特别关注 export_3ds 的,如果你那么在意的话。

标签: python string file io python-3.x


【解决方案1】:

我在你的评论中看到你提到你做了

file = open('xxx.xxx' ,'wb')

这意味着您正在打开文件以写入二进制文件(因此只需省略 b 标志)。

【讨论】:

  • 如果你仔细观察,variable.write(file) 会调用file.write(variable)
  • (对不起,代码难以阅读,看起来我无法在 cmets 中很好地格式化它)相反,我正在调用变量上的 write 方法[i ] 目的。 Nonsensicle,我知道,但出于某种原因,这是其他文件使用的风格,所以我应该坚持下去。此外,代码确实有,在 _str_off 类中,我有: def write(self,file): file.write(self.value) 确实做了一个:file.write(variable)
  • @Mike Boers,真的,更新了我的帖子。 @Leif Andersen:更新了我的帖子。
  • 确实,文件的早期版本(为 python 2.5 编写)使用字符串。我会试一试。
【解决方案2】:

我没有看到你先打开文件:

file_handler = open(path)
file_handler.write(string)
file_handler.close()

【讨论】:

  • 嗯...这实际上在我的代码的另一部分。我调用 write 方法(最后一个,用这个): file = open(filename, 'wb') primary.write(file) file.close() 但好点。
  • @Leif Andersen:如果您没有发布足够多的代码让我们查看和重现问题,那么您将不会得到太多答案。
  • @S.Lott,对不起,我只是不认为这很重要,而且它会使问题变得混乱,它现在就在那里。
  • @Leif Andersen:足以重现问题的代码永远不能称为“混乱”。
【解决方案3】:

您使用的是哪个版本的 Python?在 Python 3.x 中,字符串包含没有特定编码的 Unicode 文本。要将其写入字节流(文件),您必须将其转换为字节编码,例如 UTF-8、UTF-16 等。幸运的是,使用encode() 方法很容易做到这一点:

Python 3.1.1 (...)
>>> s = 'This is a Unicode string'
>>> print(s.encode('utf-8'))

另一个例子,将 UTF-16 写入文件:

>>> f = open('output.txt', 'wb')
>>> f.write(s.encode('utf-16'))

最后,您可以使用 Python 3 的“自动”文本模式,它会自动将您的 str 转换为您指定的编码:

>>> f = open('output.txt', 'wt', encoding='utf-8')
>>> f.write(s)

【讨论】:

  • 我在python的3.x系列。谢谢,我现在试试编码。
  • @Nate,如果你只是以f = open('output.txt', 'w') 的身份打开文件会发生什么? Python 3 将使用什么编码?
  • @jonnat 当你这样做时,你会得到一个TextIOWrapper,它使用你通过调用locale.getpreferredencoding(False)确定的首选编码,这可能是UTF-8。我总是会指定编码,或者如果我想写bytes而不使用编码,则使用'wb'
【解决方案4】:

我怀疑你使用的是 Python 3 并且已经以二进制模式打开了文件,它只接受要写入的字节或缓冲区。

我们有没有机会看到打开文件进行写入的代码?


编辑:看来这确实是罪魁祸首。

【讨论】:

    【解决方案5】:

    你是怎么打开文件的?

    根据报错信息,我猜:

    f = open("file", "wb") # b for binary mode
    

    如果你想使用字符串,你必须使用:

    f = open("file", "w") 
    

    如果您使用“b”,文件将期望二进制数据,并且您正在编写self.value,它是一个字符串。

    顺便说一句,不要使用 file" 作为变量名,因为它隐藏了 file 内置 Python 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2011-10-24
      • 2011-10-18
      • 2022-12-05
      相关资源
      最近更新 更多