Python编码,文件编码的操作

Python2&3 编码区别

Python2.X中

​ 编码格式默认 ASCII,字符串存在两种格式, str ,unicode

因为受系统的影响所以,Python 2.x在头部加上一行编码声明。

编码的转换,需要转换为unicode为中间,

s.decode('utf-8')

受系统

Win GB2312

Linux 默认UTF-8

Python3.X中

编码默认unicode,python3中默认unicode所以字符串被直接处理作为中文,在python2有的字节串是展示不出来的。

不受系统的影响统一为unicode,py文件默认为UTF-8可以不用声明

判断编码

1、使用isinstance(s, str)来判断一个字符串是否为一般字符串(str为ascii类型的字符串,utf-8、utf-16、GB2312、GBK等都是ascii类型的字符串);

2、使用type()或者.class

查看文件
1
2
3
4
5
6
7
8
9
import chardet

data =open(u"ff.txt", "rb").read()

chardet.detect(data)

{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}


字符编码(character encoding)

8 bit = 1Byte(字节)

编码:

  • ASCII.(American Standard Code for Information Interchange,汉字内码扩展规范)

    8bit. 1Byte

  • GBK.(汉字内码扩展规范) 国标码. 2Byte +>> 1字符

    GB2312(中国国家标准简体中文字符集) 16bit, 2byte 两个字节表示一个字符

    GB18030 与GBK与GB2312不同的是,GB18030采用单字节、双字节和四字节三种方式对字符编码

    GB2312 < GBK < GB18030

  • Unicode. 万国码. 32bit, 4byte ()

  • UTF-8. 可变长度的Unicode.
    英文: 1byte
    欧洲: 2byte
    中文: 3byte
  • 编码之后的数据bytes
    bytes.decode() 解码
编码
  • encode: 将默认编码(unicode)转换为其他编码。
  • decode: 将默认或者指定编码字符串转换为 unicode。
1
2
3
4
5
6
7
8
9
10
11
12
13
 s = "he" ; s


s.decode(); u # UTF-8,gbk -> UNICODE

gb = s.encode("gb2312");gb# UTF-8 -> GB2312
gb.decode("gb2312")# 可以将其转换成 UNICODE。

s.encode # UNICODE -> utf-8或gbk
u'\u4e2d\u56fd\u4eba'
gb.decode("gb2312").encode() #然后再转换成 UTF-8


更多

文件的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
基于对位置的

seek

0,以文件开头,不限定打开方式。其它的两种限定要以b模式打开

1, 相对于上次光标停留的位置

2,从文件未尾,倒序。位置要用负数表示
文件操作
open(文件路径, mode="模式", encoding="编码")
模式: r, w, a, r+, w+, a+, rb, wb, ab
for循环可以迭代文件句柄. 拿到的是一行一行的内容
seek()移动光标
tell()查看光标位置

with open(xxxx) as f:
操作

文件修改:
从源文件中读取内容. 修改, 然后写入到新文件中. 删除源文件. 重命名新文件


1B bytes (字节) = 8bit

Utf-8 中,中文1 字符 = 3 字节

seek(3)*UTF-8中 一个中文 3 个字节 读取1个字符

read(n) 读取n个字符,rb模式则读取的是n个字节

1
2
3
4
5
6
7
with open('te.txt','r') as f1:
connet = f1.read(1) #读取1个字节
#read(n) 读取n个字符,rb模式则读取的是n个字节
f1.seek(3) #一个中文字三个字节
conn2 = f1.read()
print(connet)
print(conn2)
  1. seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中⽂文部分要
    是3的倍数.

  2. 通常我们使⽤用seek都是移动到开头或者结尾.
    移动到开头: seek(0)
    移动到结尾: seek(0,2) seek的第⼆二个参数表⽰示的是从哪个位置进⾏行行偏移, 默认是0, 表

    ⽰示开头, 1表⽰示当前位置, 2表⽰示结尾

一字符


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!