一、匹配汉字
实现一个从档案中提出指定中文后对应数字的小程序,如:
很多很多的信息····
张三:18 张三其它的信息·····
很多很多的信息····
思路:
1.不能确定每个文件中都有张三这个人,所以要先判断一下张三在不在。
2.用张三把他前后的文字分隔开,再从后面的文字中挑选需要的。
一直提示错误,说是编码不对。
更正点:
1.我习惯这样来表达:u”张三“,这是把它转换成unicode,和文件中的原有编码是不一致的。所以此时应直接用“张三”。
name1 = "张三"
name2 = u"张三"
text = "我是张三"
name1 in text
True
name2 in text
False
2.注意文件的原有编码是什么,我这次收到的文件是gbk的,而之前一直都是utf-8,所以就遗漏了这个问题。因为需要批量处理文件,而文件名又是时间,于是用了一个偷懒的方法去实现转码问题。
for i in *.txt;do iconv -f gbk -t utf-8 $i>>$i;done
因为原有的gbk部分程序识别不到,所以直接加进去是不会有影响的,但是这样会把原文件更改掉。
改进法:
for i in *.txt;do iconv -f gbk -t utf-8 $i>>新建文件夹/$i;done
如果只想转文件名
默认是不改变文件,要加上notest才能生效
yum -y install convmv
convmv -f GBK -t UTF-8 -r *
convmv -f GBK -t UTF-8 --notest -r *
二、在汉字中提取单个或多个汉字
读取文件中某个固定位置的中文,如每行的最后一个文字,但是一直匹配不出来,解决方法如下:
在utf-8的编码下,一个非unicode的中文占3个字符,即Chinese_character = line[-3:]
三、数据传输
一直乱码,就是被json弄到ascii了,要这样写
json.dumps(response, ensure_ascii=False)
四、查看字符串类型
import sys
print sys.getdefaultencoding()
print isinstance(你的那个数, unicode)
在文件开头加上
reload(sys)
sys.setdefaultencoding(‘utf8′)这2行,再试着运行一下
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。
如:s='中文'
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。
如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s,unicode) #用来判断是否为unicode
用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?
#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()
该段程序在英文WindowsXP上输出为:ascii