一、文件编码及转码的问题总结
Spyder中,在preference(小工具图标)-current working directory中,选择第一项,将工作路径选成当前文件的位置。日后需要读取文件,放在同一个文件夹即可,解决文件读取的路径问题。可以用以下两句确认一下:
import os
print(os.getcwd()) #获取当前路径
确认文件是否是utf-8格式,可以通过sublime这样的文本打开看,如果乱码,基本可以确定不是utf-8。
excel能够正确识别用gb2312、gbk、gb18030或utf_8 with BOM 编码的中文,如果是utf_8 no BOM编码的中文文件,excel打开会乱码。
一般情况下,文件的第一句就标出来了,#!/usr/bin/envpython3 # -*- coding: utf-8 -*-还是可以用以下:
#获取系统默认编码:
import sys
print(sys.getdefaultencoding()
在进行同时包含 str 与 unicode 的运算时,Python 一律都把 str 转换成unicode 再运算,当然,运算结果也都是 unicode。
二进制位叫做bit,是0和1这两种状态;八个bit可以组合256种状态,叫一个字节,byte。二进制转十六进制很方便,所以字节可以用两个十六进制数表示。一五一五二五六嘿嘿。
csv文档用的不是utf-8编码,这时候需要解码,涉及到各种码的情况。总结如下表。
Python3.X源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。
在python中有两种字符串类型,分别是 str 和unicode,在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等。
从unicode变成其他的编码,是encoding,因为是从每一个没有编码的东西,变成一个有编号的东西;从utf-8,gbk等转化成unicode,是decoding,因为是从一个有编码的东西让她变成没有的,de下去。
直接执行encode('gb2312'),Python 会自动的先将内容解码为 unicode,然后再编码成 gb2312。因为解码是python自动进行的,如果没有指明解码方式,python 就会使用sys.defaultencoding指明的方式来解码。很多情况下 sys.defaultencoding 是 ANSCII,如果 s 不是这个类型就会出错。但是!为什么我没有出现这个问题,因为在最开始,我们的Spyder已经在开头规定了utf-8,也就是明确指出了文件原来的编码方式。所以直接encoding就好了,但它的内在顺序是utf-8➡️unicode➡️gb2312。
如果按照这个逻辑,如果我前面指定utf-8,转码时候也写成utf-8,应该也可以吧?
file01=open('aaa.csv',encoding="utf-8"),会报错。
python中的print直接把字符串传递给操作系统,所以需要把str解码成与操作系统一致的格式。(mac格式是啥,不知道。反正大概是这个意思,累了。)
二、课堂上产生的叽歪需求探索
1.找到某个特殊字符的编码:先把它列出来看看在哪里,位置找到以后用ord输出。
l1=list(d.items())
print(ord(l1[26][0]))
2.如何给有两个元素的list写循环?
问题描述:把dic转成列表以后,会得到一个大列表,每个列表有两个元素(键[0]和值[1]),写一个循环,列出每一个键的编码,即直接对每一个键全部执行ord。
#%%整理结果
f1=open("ALICE.txt","r",encoding="gbk")
s=f1.read()
s=s.lower()
s=s.replace(i,"")
d={}
for ch in s:
d[ch]=d.get(ch,0)+1
print(d,len(d))
l1=list(d.items())
print(len(l1))
for i in range(27):
print("{}{:6}{:6}".format(l1[i][0],ord(l1[i][0]),l1[i][1]))
#找到那个奇怪字符的ord后,把它替换掉,然后排序
l1.sort(key=lambda x:x[1],reverse=True)
for i in range(26):
print("{}{:6}".format(l1[i][0],l1[i][1]))
怀疑自己是个天才或者傻子。临下课脑子不转了,为什么想在for 里面直接些 l1,换成range不就好了,避免它出现在for语句控制里,在循环的部分再写。感觉像高中数学题的套路。
三、正则表达式
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
廖老师博客给出判断是否为email的方法,假设要判断一个字符串是否是合法的“快递收件人信息”,步骤应该是:1.创建一个匹配“快递收件人信息”的正则表达式;2.用该正则表达式去匹配用户的输入,来判断是否合法。
如何用字符来表述字符呢?
比如我规定,快递收件人信息包括三块,“姓名”+“电话”+“地址”,这样就需要用字符来描述字符。在正则表达式中,如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字,所以:
·'00\d'可以匹配'007',但无法匹配'00A';
·'\d\d\d'可以匹配'010';
·'\w\w\d'可以匹配'py3';
·.可以匹配任意字符,所以:'py.'可以匹配'pyc'、'pyo'、'py!'等等。
·用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用表示n个字符,用表示n-m个字符:
4. 举个
\d\s+\d\s+\d这是一个3-4-4的电话号码
\d这是一个没空格的电话号码
A|B可以匹配A或B,所以(\d\s+\d\s+\d|\d)可以匹配去寄快递的人输入的两种电话,也许他只是直接粘贴的,会有空格(未必太thoughtful)。
^表示行的开头,^\d表示必须以数字开头。$表示行的结束,\d$表示必须以数字结束。
5.进阶
·要做更精确地匹配,可以用[]表示范围,比如:
·[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;
[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;
·[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
·[a-zA-Z\_][0-9a-zA-Z\_]更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
6.正式的举例子
为了不考虑转义的问题,推荐使用python的r前缀。
s =r'ABC\-001'# Python的字符串
# 对应的正则表达式字符串不变:
# 'ABC\-001'
match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:
test ='用户输入的字符串'
ifre.match(r'正则表达式', test):
print('ok')
else:
print('failed')
先到这里了!!!贪婪表达式什么的下周再看吧!!!(and保留问题:怎么只有字母,没有中文,中文咋表示?)脑袋累晕了要脱发了!周日的悠闲下午已经贡献四个小时给python,必须出门放松一下了!我倒
领取专属 10元无门槛券
私享最新 技术干货