【问题标题】:Can I use cStringIO the same as StringIO?我可以像 StringIO 一样使用 cStringIO 吗?
【发布时间】:2011-06-08 07:55:19
【问题描述】:

我这样做了:

import cStringIO.StringIO as StringIO

我意识到我一直在使用它。可以吗? 是不是和StringIO一样对待?

【问题讨论】:

    标签: python c stringio


    【解决方案1】:

    它们不一样。 cStringIO 无法正确处理 unicode 字符。

    >>> StringIO.StringIO().write(u'\u0080')
    
    >>> cStringIO.StringIO().write(u'\u0080')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
    

    【讨论】:

    • @TIMEX:您需要对 ASCII 以外的 Unicode 字符的支持吗?
    • 不知道。我只是使用 StringIO 来拍照。并阅读图片,然后将其上传到 S3
    • @Mark Byers - 你知道 cStringIO 在 Python3 中是否能更好地处理 Unicode?​​span>
    • @Omnifarious:Python3 中没有 cStringIO。它被 io.StringIO 和 io.BytesIO 取代,它们与 Python3 一致,分别用于 Unicode 和字节字符串,并且如果可用,它们会自动使用本机实现(很可能需要在 Python2 中手动加载像 cStringIO 这样的本机实现一个奇怪的 API 兼容性工件)。
    • 另一方面,如果您自己对字符串进行编码,您仍然可以将它们提供给 cStringIO。例如,cStringIO.StringIO().write(u'\u2603') 不起作用,但 cStringIO.StringIO().write(u'\u2603'.encode('utf-8')) 可以正常工作。
    【解决方案2】:

    您也不能在 cStringIO.StringIO 实例上设置属性:

    >>> from cStringIO import StringIO
    >>> s = StringIO()
    >>> s.name = 'myfile'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'cStringIO.StringO' object has no attribute 'name'
    

    一些库依赖于具有namecontent_type 属性的类文件对象,因此cStringIO.StringIO 在这些情况下不起作用。

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 2016-10-17
      相关资源
      最近更新 更多