首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python 3中的流/字符串/字节数组转换

Python 3中的流/字符串/字节数组转换
EN

Stack Overflow用户
提问于 2009-07-29 01:04:56
回答 2查看 6.9K关注 0票数 3

Python 3清理了Python对Unicode字符串的处理。我认为,作为这项工作的一部分,根据Python 3文档Python 2文档相比,Python3中的编解码器已经变得更加严格。

例如,从概念上将字节流转换为不同形式的字节流的编解码器已被删除:

  • base64_codec
  • bz2_codec
  • hex_codec

还删除了从概念上将Unicode转换为不同形式Unicode的编解码器(在Python 2中,它实际上介于Unicode和字节流之间,但从概念上说,它实际上是Unicode到Unicode ):

  • rot_13

我的主要问题是,在Python3中有什么“正确的方法”来做这些删除的编解码器以前做的事情?--它们不是严格意义上的编解码器,而是“转换”。但是接口和实现将非常类似于编解码器。

我不关心rot_13,但我想知道实现行结束样式转换的“最佳方式”(Unix行尾与Windows行尾),这应该是在编码字节流之前完成的Unicode到Unicode转换,特别是在使用UTF-16时,正如另一个这样的问题所讨论的那样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-05 12:38:59

看起来所有这些非编解码模块都是逐案处理的。到目前为止,我发现的是:

  • base64现在可通过base64模块获得。
  • bz2现在可以使用bz2模块完成。
  • hexlify六进制字符串编码/解码可以使用比纳西模块的unhexlify函数完成(有点隐藏功能)。

我猜这意味着没有标准的框架来创建这样的字符串/字节数组转换模块,但是它们是在Python 3中逐案完成的。

Python 3.2的更新

一个评论一篇博客文章“使用Python的unicode支持压缩文本”提醒我,这些编解码器已经返回Python3.2了。

引用以下评论:

但是,由于这些是“文本到文本”或“二进制到二进制”的转换,Python3.x中的encode()/decode()方法不支持这种用法--这是Python2.x的一个特性)。 编解码器本身是3.2版的,但是您需要通过编译码模块API来使用它们--它们不是通过object方法速记获得的。

看看-二进制变换

来自巴里华沙的博客文章

您是否知道Python2为执行有趣的转换提供了一些编解码器,如Caeser旋转(即rot13)?因此,您可以这样做:编码(‘rot-13’) 'sbb‘ 但是,这在Python3中不起作用,因为即使仍然存在某些str到str编解码器(如rot-13 ),但str.encode()接口要求编解码器返回一个字节对象。为了在Python 2和Python 3中使用str到str编解码器,您必须打开外壳并使用较低级别的API,直接获取和调用编解码器: 从编码器导入>>>编码器= getencoder('rot-13') >>> rot13string =编码器(Mystring) 您必须从编码器的返回值中获取零元素,因为使用了codecs。有点难看,但是它在Python的两个版本中都能工作。

票数 6
EN

Stack Overflow用户

发布于 2009-08-05 13:01:21

您对行结束转换的具体需求是什么?如果只用于写入文件或文件对象,则可以指定与open()一起使用的行结束格式,而\n将在写入文件时自动转换为行结束格式。不可否认,这只适用于以文本形式打开的文件,而不是数据。(您还可以指定在将文本写入文件时使用的编码方式,这有时会很有用。)

http://docs.python.org/3.1/library/functions.html#open

要使用常规字符串进行转换,只需执行yourstring = yourstring.replace('\n', '\r\n')将Linux样式转换为Windows样式,yourstring = yourstring.replace('\r\n', '\n')用于从Windows风格转换为Linux样式。不过,你可能已经知道了,这可能不是你要找的东西。(实际上,如果您正在写入一个文本文件,那么无论如何,如果启用了通用换行符模式(这是默认的),它应该将\n转换为\r\n

同样,如果您想在各种Unicode映射之间进行转换(假设您正在处理字节序列,因为Python内部使用的字符串实际上没有设置为任何特定类型的Unicode),那么只需使用bytes.decode()bytearray.decode()解码字节序列,然后使用str.encode()进行编码。将UTF-8改为UTF-16:

代码语言:javascript
运行
复制
newstring = yourbytes.decode('utf-8')
yourbytes = newstring.encode('utf-16')

这样做时,换行符不能在两种Unicode格式之间正确转换,这不会有任何问题。

还有str.translate()str.maketrans(),不过我不确定它们是否有用:

http://docs.python.org/3.1/library/stdtypes.html#str.translate

http://docs.python.org/3.1/library/stdtypes.html#str.maketrans

另外,可以这样实现rot_13:

代码语言:javascript
运行
复制
import string
rot_13 = str.maketrans({x: chr((ord(x) - ord('A') + 13) % 26 + ord('A') if x.isupper() else ((ord(x) - ord('a') + 13) % 26 + ord('a'))) for x in string.ascii_letters})

# Using hard-coded values:

rot_13 = str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm')

无论哪种方式,使用S.translate(rot_13)都会导致普通字符串变成rot_13,而rot_13字符串变成普通字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1197589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档