记录我学习《流畅的python》的过程

  • 2021.1.18

2021.1.18

1.处理文本文件
依赖默认编码来处理文本文件会遇到一些问题。

t = open('cafe.txt', 'w', encoding='utf_8').write('café')
print(t)
f = open('cafe.txt').read()
print(f)

运行结果:

问题是:写入文件时指定了utf-8编码,但是读取文件时没有这么做,使用的是系统默认的编码,所以会出现这种问题。

解决的办法:

fp = open('cafe.txt', 'w', encoding='utf_8')
print(fp)print(fp.write('café'))
print(fp.close())import os
print(os.stat('cafe.txt').st_size)fp2 = open('cafe.txt')
print(fp2)
print(fp2.encoding)
print(fp2.read())fp3 = open('cafe.txt', encoding='utf_8')#使用正确的编码打开文件
print(fp3)
print(fp3.read())fp4 = open('cafe.txt', 'rb')#'rb'标志指明在二进制模式下读取文件
print(fp4)
print(fp4.read)

运行结果:

2.编码默认值
探索编码默认值

import sys,localeexpersions = """locale.getpreferredencoding()type(my_file)my_file.encodingsys.stdout.isatty()sys.stdout.encodingsys.stdin.isatty()sys.stdin.encodingsys.stderr.isatty()sys.stderr.encodingsys.getdefaultencoding()sys.getfilesystemencoding()"""my_file = open('dummy', 'w')for expersion in expersions.split():value = eval(expersion)print(expersion.rjust(30), '->', repr(value))

运行结果:

关于编码默认值的最佳建议是:别依赖默认值。
2.正确比较,规范化Unicode字符串
用两种方式表示café,位数不一样,结果却一样。

s1 = 'café'
s2 = 'cafe\u0301'
print(s1, s2)print(len(s1), len(s2))
print(s1 == s2)

运行结果:

s1和s2这两种序列成为标准等价物,应用程序把他们视作相同的字符,但是在python中码位不同,判定二者不同。
解决方案:使用unicodedata.normalize函数提供的Unicode规范化。

  • NFC,使用最少的码位构成等价的字符串

  • NFD,把组合字符分解成基字符和单独的组合字符

from unicodedata import normalize
s1 = 'café'  # 把“e”和重音符组合在一起
s2 = 'cafe\u0301' # 分解成“e”和重音符
print(len(s1), len(s2))print(len(normalize('NFC', s1)), len(normalize('NFC', s2)))print(len(normalize('NFD', s1)), len(normalize('NFD', s2)))print(normalize('NFC', s1) == normalize('NFC', s2))
print(normalize('NFD', s1) == normalize('NFD', s2))

运行结果:

使用NFC,有些单字符会被规范化成另一个单字符。

from unicodedata import normalize,name
ohm = '\u2126'
print(name(ohm))ohm_c = normalize('NFC', ohm)
print(name(ohm_c))print(ohm == ohm_c)print(normalize('NFC', ohm) == normalize('NFC', ohm_c))

运行结果:

  • NFKC,K表示兼容性
from unicodedata import normalize,name
half = '½'
print(normalize('NFKC', half))four_squared = '4²'
print(normalize('NFKC', four_squared))micro = 'μ'
micro_kc = normalize('NFKC', micro)
print(micro, micro_kc)print(ord(micro), ord(micro_kc))
print(name(micro), name(micro_kc))


问题是输入法所输入的μ应该是不同,书上的结果两个μ不同。
微子符μ和小写希腊字母μ
3.大小写折叠
大小写折叠就是把所有文本变成小写,在做些其他转换。由str.casefold()实现
对于只包含latin1字符的字符串,它和lower一样,除了μ。

from unicodedata import name
micro = 'μ'
print(name(micro))micro_cf = micro.casefold()
print(name(micro_cf))print(micro, micro_cf)eszett = 'β'
print(name(eszett))eszett_cf = eszett.casefold()
print(name(eszett_cf))

运行结果:

这里的例子显示的都一样,可以选用一些其他的微字符来表示。
4.比较规范化Unicode字符串

rom unicodedata import normalizedef nfc_equal(str1, str2):return normalize('NFC', str1) == normalize('NFC', str2)def fold_equal(str1, str2):return (normalize('NFC', str1).casefold() ==normalize('NFC', str2).casefold())s1 = 'café'
s2 = 'cafe\u0301'
print(s1 == s2)print(nfc_equal(s1, s2))
print(nfc_equal('a', 'A'))s3 = 'Straße' # ß为德语的ss
s4 = 'strasse'
print('\n')
print(s3 == s4)
print(nfc_equal(s3, s4))
print(fold_equal(s3, s4))
print(fold_equal(s1, s2))
print(fold_equal('A', 'a'))

运行结果:

5.极端规范化
去掉字符串中的所有变音符号

import unicodedata
import stringdef shave_marks(txt):"""去掉全部变音符号"""norm_txt = unicodedata.normalize('NFD', txt) # 把所有字符分解成基字符和组合符号shaved = ''.join(c for c in norm_txtif not unicodedata.combining(c)) # 过滤所有组合记号return unicodedata.normalize('NFC', shaved) # 重组order = '"Herr Voß: · ½ cup of tker caffòǒèīèě"'
print(shave_marks(order))


深入规范化:

import unicodedata
import stringdef shave_marks_latin(txt):"""把拉丁基字符中的所有的变音符号删除"""norm_txt = unicodedata.normalize('NFD', txt) # 把所有字符分解成基字符和组合符号latin_base = Falsekeepers = []for c in norm_txt:if unicodedata.combining(c) and latin_base:continue # 忽略拉丁基字符上的变音符号keepers.append(c)# 如果不是组合字符,那就是新的基字符if not unicodedata.combining(c):latin_base = c in string.ascii_lettersshaved = ''.join(keepers)return unicodedata.normalize('NFC', shaved) # 重组order = '"Herr Voß: · ½ cup of tker caffòǒèīèě"'
print(shave_marks_latin(order))


这里面没有变音的非希腊字母,可以自行示范。
6.Unicode文本排序
初始排序:

fruits = ['caju', 'atemoia', 'cajá', 'açai', 'acerola']
sorted_fruits = sorted(fruits)
print(sorted_fruits)

优化后:

import locale
print(locale.setlocale(locale.LC_COLLATE, 'pt_BR.UTF-8'))
fruits = ['caju', 'atemoia', 'cajá', 'açai', 'acerola']
sorted_fruits = sorted(fruits, key=locale.strxfrm)
print(sorted_fruits)

使用Unicode排序算法排序:

import pyuca
coll = pyuca.Collator()
fruits = ['caju', 'atemoia', 'cajá', 'açai', 'acerola']
sorted_fruits = sorted(fruits, key=coll.sort_key)
print(sorted_fruits)


7.Unicode数据库

import unicodedata
import rere_digit = re.compile(r'\d')sample = '1\xbc\xb2\u0969\u216b\u2466\u2480\u3285'for char in sample:print('U+%04x' % ord(char),char.center(6),'re_dig' if re_digit.match(char) else '-','isdig' if char.isdigit() else '-','isnum' if char.isnumeric() else '-',format(unicodedata.numeric(char), '5.2f'),unicodedata.name(char),sep='\t')


8.支持字符串和字节序列的双模式API
可以使用正则表达式搜索字符串和字节序列,但是在后一种情况中,ASCII范围外的字节不会当成数字和组成单词的字母。

import rere_numbers_str = re.compile(r'\d+')
re_words_str = re.compile(r'\w+')
re_numbers_bytes = re.compile(rb'\d+')
re_words_bytes = re.compile(rb'\w+')
text_str = ("Ramanujan saw \u0be7\u0bed\u0be8\u0bef"" as 1729 = 1³ + 12³ = 9³ + 10³.")text_bytes = text_str.encode('utf-8')print('Text', repr(text_str), sep='\n  ')
print('Numbers')
print('  str  :', re_numbers_str.findall(text_str))
print('  bytes:', re_numbers_bytes.findall(text_bytes))
print('Words')
print('  str  :', re_words_str.findall(text_str))
print('  bytes:', re_numbers_bytes.findall(text_bytes))

记录学习《流畅的python》的一些知识-----字符(2)相关推荐

  1. 【学习笔记】Python 基础零碎知识

    Python 基础零碎知识 条件表达式 比如上面的if条件判断,我们可以用条件表达式(Conditional Expression)更加简洁的书写. y = math.log(x) if x > ...

  2. 【学习笔记】Python基础入门知识笔记,万字攻略带你走进Python编程

    ​ Python笔记,由此开始吧 本文是笔者在学习Python过程做的笔记总结,将简要讲述Python的基础知识,内容清晰易理解,相信你也能轻松的学会Python的入门基础知识内容.同时也希望这篇文章 ...

  3. python 科学计算机_在这个免费的虚拟俱乐部中学习计算机科学和Python的基础知识

    python 科学计算机 Are you learning how to code in 2020? 您是否正在学习2020年编码? Or are you already working as a d ...

  4. 记录学习自动化测试(python+weditor)的问题

    安装的时候百度的,具体记不得了(看过https://www.jb51.net/article/205942.htm,UIAutomator2的使用 | Vicの博客) 安装uiautomator2: ...

  5. Python入门基础知识学什么?

    Python基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python入门基础知识学什么呢?来看看下面小编的详细介 ...

  6. 记录学习《流畅的python》的一些知识-----对象引用,可变性和垃圾回收

    记录我学习<流畅的python>的过程--对象引用,可变性和垃圾回收 2021.9.22 1.变量不是盒子 2.标识.相等性和别名 3.默认做浅复制 4.函数的参数作为引用时 5.del和 ...

  7. python笔记基础-Python入门基础知识学习笔记之一

    为什么要写这篇文章? 本人做过Objective-C开发,现在在用C#做WinForm开发.近段时间在学习Python入门基础知识时,发现有很多知识点和Objective-C的不一样.故想通过本文记录 ...

  8. 【流畅的Python学习笔记】2023.4.21

    此栏目记录我学习<流畅的Python>一书的学习笔记,这是一个自用笔记,所以写的比较随意 特殊方法(魔术方法) 不管在哪种框架下写程序,都会花费大量时间去实现那些会被框架本身调用的方法,P ...

  9. 流畅的Python学习

    流畅的Python笔记 流畅的Python笔记 1 Python数据模型 2 数据结构 2.1 内置序列类型 2.2 列表推导与生成器表达式 2.3 元组 2.4 切片 2.5 序列对象上的+与* 2 ...

最新文章

  1. 左神算法:用递归函数和栈逆序一个栈(Java版)
  2. java 定时器delay_技术贴-java 定时器
  3. mysql5.7.1.16出现[Err] 1146 - Table 'performance_schema.session_status' doesn't exist的解决办法
  4. 【多题合集】【loliの模拟赛】排列组合大套餐
  5. 设计师要的各式各样的设计软件插件都整理好了!
  6. Go语言struct{}类型的channel
  7. 深入Hadoop磁盘部署的算法
  8. python bokeh slider_Bokeh数据可视化工具3视觉增强及服务器
  9. (转)C# 与Rust :知识库
  10. snipaste如何滚动截图_别再花时间去找截图软件了,只用考虑这三款!
  11. android窗口动画和壁纸关系,Android壁纸管理(Android N)
  12. 华为项目CMO(CIE)的经历,对软件工程敏捷开发的实践
  13. 协同编辑中使用的 OT 算法是什么?
  14. MacBook上内容太大无法拷贝到U盘问题的解决
  15. android两个app合并
  16. yii2自动更新时间
  17. Prometheus + Grafana 实现监控功能总结
  18. PS和AI结合制作人物矢量图
  19. 华为手机总是弹出风险提示
  20. linux分区写保护,mtd分区写保护关闭

热门文章

  1. html+jquery实现页面中英文切换
  2. 苹果AppStore官方应用审核标准
  3. 【JavaScript】js简易实现检测系统字体是否存在
  4. 一篇五分生信临床模型预测文章代码复现——Figure 7 外部数据集验证模型
  5. Windows双系统启动时引导仍为单系统问题解决
  6. 大数据特征与发展历程
  7. 手机开机linux企鹅,修改linux内核的开机图片(小企鹅)
  8. 人工智能洗稿-免费自媒体洗稿工具
  9. 易企秀怎么做投票链接怎么做一个投票链接微信链接怎么制作的
  10. Qt平台使用fft解析肌电传感器信号