StringIO 替换可以使用字节而不是字符串吗?

发布于 2024-11-17 04:29:31 字数 150 浏览 3 评论 0原文

python StringIO 类是否有任何替代品,可以使用 bytes 而不是字符串?

这可能并不明显,但如果您使用 StringIO 来处理二进制数据,那么您对 ​​Python 2.7 或更高版本就不那么幸运了。

Is there any replacement for python StringIO class, one that will work with bytes instead of strings?

It may not be obvious but if you used StringIO for processing binary data you are out of luck with Python 2.7 or newer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

零崎曲识 2024-11-24 04:29:31

尝试 io.BytesIO

正如其他 指出,你确实可以在 2.7 中使用 StringIO,但是 BytesIO 是向前兼容的一个不错的选择。

Try io.BytesIO.

As others have pointed out, you can indeed use StringIO in 2.7, but BytesIO is a good choice for forward-compatibility.

樱花坊 2024-11-24 04:29:31

在 Python 2.6/2.7 中, io 模块旨在与 Python 3.X 兼容。来自文档:

2.6 版本中的新增功能。

io模块提供了Python
流处理的接口。在下面
Python 2.x,这被提议为
内置文件的替代品
对象,但在 Python 3.x 中它是
访问文件的默认接口和
流。

注意由于该模块已
主要为 Python 3.x 设计,您
必须意识到所有用途
本文档中的“字节”指的是
str类型(其中bytes是别名),
所有“文本”的使用均指
统一码类型。此外,那两个
类型不可互换
io API。

在 3.X 之前的 Python 版本中, StringIO 模块包含 StringIO 的旧版本,与 io.StringIO 不同,它可以在 Python 2.6 之前的版本中使用:

>>> import StringIO
>>> s=StringIO.StringIO()
>>> s.write('hello')
>>> s.getvalue()
'hello'
>>> import io
>>> s=io.StringIO()
>>> s.write('hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument expected, got 'str'
>>> s.write(u'hello')
5L
>>> s.getvalue()
u'hello'

In Python 2.6/2.7, the io module is intended to be used for compatibility with Python 3.X. From the docs:

New in version 2.6.

The io module provides the Python
interfaces to stream handling. Under
Python 2.x, this is proposed as an
alternative to the built-in file
object, but in Python 3.x it is the
default interface to access files and
streams.

Note Since this module has been
designed primarily for Python 3.x, you
have to be aware that all uses of
“bytes” in this document refer to the
str type (of which bytes is an alias),
and all uses of “text” refer to the
unicode type. Furthermore, those two
types are not interchangeable in the
io APIs.

In Python versions earlier than 3.X the StringIO module contains the legacy version of StringIO, which unlike io.StringIO can be used in pre-2.6 versions of Python:

>>> import StringIO
>>> s=StringIO.StringIO()
>>> s.write('hello')
>>> s.getvalue()
'hello'
>>> import io
>>> s=io.StringIO()
>>> s.write('hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument expected, got 'str'
>>> s.write(u'hello')
5L
>>> s.getvalue()
u'hello'
是你 2024-11-24 04:29:31

你说:“这可能并不明显,但如果你使用 StringIO 来处理二进制数据,那么你对 Python 2.7 或更高版本就不那么幸运了”。

这并不明显,因为它不是真的。

如果您的代码可以在 2.6 或更早版本上运行,那么它也可以在 2.7 上继续运行。未编辑的屏幕转储(Windows 命令提示符窗口在第 80 列及所有位置换行):

C:\Users\John>\python26\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr
ite('hello\n');print repr(s.getvalue()), sys.version"
'hello\n' 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)]

C:\Users\John>\python27\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr
ite('hello\n');print repr(s.getvalue()), sys.version"
'hello\n' 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)]

如果您需要编写在 2.7 和 3.x 上运行的代码,请使用 中的 BytesIO 类io 模块。

如果您需要/想要一个支持 2.7、2.6、... 和 3.x 的单一代码库,您将需要更加努力。 使用six 模块应该有很大帮助。

You say: "It may not be obvious but if you used StringIO for processing binary data you are out of luck with Python 2.7 or newer".

It is not obvious because it is not true.

If you have code that works on 2.6 or earlier, it continues to work on 2.7. Unedited screen dump (Windows Command prompt window wrapping at col 80 and all):

C:\Users\John>\python26\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr
ite('hello\n');print repr(s.getvalue()), sys.version"
'hello\n' 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)]

C:\Users\John>\python27\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr
ite('hello\n');print repr(s.getvalue()), sys.version"
'hello\n' 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)]

If you need to write code that runs on 2.7 and 3.x, use the BytesIO class in the io module.

If you need/want a single codebase that supports 2.7, 2.6, ... and 3.x, you will need to work a bit harder. Using the six module should help a lot.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文