2017年9月5日

  1. python中可以表示字节的有bytes,bytesarray,memoryview
chinese = bytes('englishENG中文', encoding='utf8')
print(chinese) # bytes可以通过构造函数传入str获得
# b'englishENG\xe4\xb8\xad\xe6\x96\x87'
print(chinese[0]) # 使用索引可以获得range(256)之间的整数
# 101
print(chinese[:1]) # bytes切片还是bytes对象,哪怕只有一个字节
# b'e'
chinese_arr = bytearray(chinese) # bytearray没有字面量
print(chinese_arr)
# bytearray(b'englishENG\xe4\xb8\xad\xe6\x96\x87')
print(chinese_arr[:1]) # bytearray的切片还是bytearray对象
# bytearray(b'e')
print(bytes.fromhex('31 4B CE A9')) # fromhex可以解析16进制数字,空格可选
# b'1K\xce\xa9'
  1. 可以通过数组的原始数据初始化bytes对象。
numbers = array.array('h', [-2, -1, 0, 1, 2])  # h是占两个字节的有符号整型
octets = bytes(numbers)
print(octets)
# b'\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00'

1.通过结构体可以将字节序列转换成不同类型字段组成的元组或者反向转换。struct模块能处理bytes,bytearray,memoryview对象。 memoryview对象不是用于创建字节序列的而是共享内存,如PIL库就是这样处理的,不用复制字节序列了。

import struct

fmt = '<3s3sHH'  # 结构体的格式,<是小字节序,3s3s是两个3字节序列,HH是两个16位二进制整数。
with open('7a.jpg', 'rb') as fp:
    img = memoryview(fp.read())
    # 使用缓冲类对象缓冲bytes或bytearray时始终复制对象中的字节序列,与之相反,memoryview允许共享内存
header = img[:10]  # 使用切片会再创建一个memoryview对象,不会复制字节序列
print(bytes(header))  # 转换成字节序列为了显示,这里复制了10个字节。
# b'GIF89a\x00\x05\xd0\x02'
print(struct.unpack(fmt, header))  # 拆包memoryview对象,得到一个元组,包含类型、版本、宽度和高度。
# (b'GIF', b'89a', 1280, 720)
del header  # 删除引用,释放memoryview实例所占的内存
del img
  1. 侦测文件是什么编码类型,可以用chardet,既有python版本,又有命令行版本
import chardet

print(chardet.detect(b))
# {'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}
chardetect dict_test.py
# dict_test.py: utf-8 with confidence 0.99
  1. 利用gbk编码对汉字排序
# locale.setlocale(locale.LC_COLLATE, 'zh_CN.UTF8')
fruits = ['苹果', '梨', '西瓜', '哈密瓜', '橘子', '香蕉', '葡萄', '桔子']
# sorted_fruits = sorted(fruits, key=locale.strxfrm)
for f in fruits:
    print(f.encode('gbk'))
sorted_fruits = sorted(fruits, key=lambda s: s.encode('gbk', errors='ignore'))
print(sorted_fruits)
# ['哈密瓜', '桔子', '梨', '苹果', '葡萄', '西瓜', '香蕉', '橘子']

设置locale的办法在windows上经常得不到支持,蛋疼,退而求其次,可以使用gbk码表排序。

原文发布于微信公众号 - python全栈布道师(gh_f7cbe2f9567b)

原文发表时间:2017-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏维C果糖

编程思想 之「对象漫谈」

在「语言导论」中,我们曾提到过「万物皆对象」,事实上,也确实如此。在面向对象编程的世界中,我们创建对象、操作对象、销毁对象,我们所做的一切动作都离不开对象。在本...

563190
来自专栏信数据得永生

JavaScript 编程精解 中文第三版 五、高阶函数

314100
来自专栏WeaponZhi

轻松初探Python(六)—函数

这是「AI 学习之路」的第 6 篇,「Python 学习」的第 6 篇 题外话 这周工作日 5 天,我并没有更新文章,但大家并不要以为小之懒惰了。正好相反,自从...

37570
来自专栏待你如初见

Day01

不推荐使用强制的类型转换,它容易丢失数据,除非不得已,并且你确定不会出现数据丢失才可以使用。

16250
来自专栏琦小虾的Binary

map 学习(下)——C++ 中的 hash_map, unordered_map

map 学习(下)——C++ 中的 hash_map, unordered_map 接上篇《map 学习(一)——C++中 map 的使用》。 一、hash_m...

3.7K70
来自专栏技术与生活

java 对象池技术

1、为什么用对象池 在 java 中,对象的生命周期包括对象创建、对象使用,对象消失三个时间段,其中对象的使用是对象真正需要存活的时间,不好修改,该用的时候...

34240
来自专栏谦谦君子修罗刀

swift4.0语法杂记(精简版)

一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年...

47890
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻Runtime本质(二)

27920
来自专栏null的专栏

设计模式——类图以及类与类之间的关系

    设计模式在程序设计上有着很重要的作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。 一、用UML表示一个类 ? 类图一般是三行...

37440
来自专栏java达人

js的回调函数详解

在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递...

39450

扫码关注云+社区

领取腾讯云代金券