在Python 3流/字符串/字节组转换(Stream/string/bytearray trans

2019-09-21 06:37发布

Python的3清理Unicode字符串Python的处理。 我假定作为这种努力的一部分,在Python 3编解码器已经变得更加严格,根据Python 3的文档相比, Python 2的文档 。

例如,编解码器概念字节流转换为另一种形式的字节流已被删除:

  • base64_codec
  • bz2_codec
  • hex_codec

和编解码器,在概念上Unicode转换到不同形式的Unicode的也已被删除(在Python 2实际上Unicode和字节流之间的去了,但在概念上它是真正的Unicode为Unicode我认为):

  • rot_13

我的主要问题是,什么是在Python 3“正确的方法”做什么用这些移除的编解码器做什么? 他们不是严格意义上的编解码器,但“转变”。 但界面和实施将是非常相似的编解码器。

我不关心rot_13,但我想知道什么是应该真的是Unicode到Unicode的“最佳方式”来实现的行结束样式的转换(Unix行结尾VS Windows行结尾)变换编码,以字节流之前进行,特别是当正在使用UTF-16,如所讨论的这个其他SO问题 。

Answer 1:

看起来好像所有这些非编解码器模块将根据具体情况逐案处理。 这是我迄今为止的发现:

  • Base64是现在可以通过提供的base64模块
  • BZ2现在可以使用做BZ2模块
  • 十六进制字符串编码/解码可以用做hexlifyunhexlify所述的功能binascii模块(比特隐藏特征的)

我想这意味着有建立这样的字符串/字节组变换模块没有标准的框架,但他们正在对案件逐案基础上在Python 3完成。

更新为Python 3.2

一个关于“使用Python的Unicode支持压缩文本”一博客文章评论提醒我一个事实,即这些编解码器是回来为Python 3.2。

引述的评论:

因为这些都是“文本到文本”或“二进制到二进制”的转换,不过,在Python 3.x的编码()/解码()方法不支持使用的这种风格 - 这是一个Python 2。 X才有的功能)。

编解码器本身是回到了3.2,但你需要去通过编解码器模块API,以便使用他们 - 他们是不可通过对象方法的简写。

看看在Python的3文档的codecs -二进制变换 。

从巴里华沙博客文章 :

你知道吗,Python 2中提供了这样做有意思的转换某些编解码器,如Caeser旋转(即ROT13)? 因此,你可以做这样的事情:

 >>> 'foo'.encode('rot-13') 'sbb' 

这并不在Python 3的工作,虽然,因为即使某些STR对STR编解码器像腐烂-13依然存在,str.encode()接口要求codec返回bytes对象。 为了使用STR对STR编解码器在两个Python 2和Python 3中,你必须弹出罩,并使用较低级别的API,获取和直接调用编解码器:

 >>> from codecs import getencoder >>> encoder = getencoder('rot-13') >>> rot13string = encoder(mystring)[0] 

你必须从因为编解码器API的编码器的返回值获得零元。 丑了一点,但它工作在Python的两个版本。



Answer 2:

特别是你的需要进行行尾转换? 如果它只是写入到文件或文件对象,你可以指定哪些行结束格式与使用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在Windows系统上无论如何,如果启用了通用换行模式,这是默认的。)

同样,如果你想各种的Unicode映射之间进行转换(假设你使用的字节序列的工作,像Python内部实际上并没有设定任何特定类型的Unicode的使用字符串),它只是一个解码的事使用字节序列bytes.decode()bytearray.decode()然后使用编码str.encode() 对于来自UTF-8为UTF-16的转化:

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可以实现为这样:

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_13rot_13字符串变成正常的。



文章来源: Stream/string/bytearray transformations in Python 3