mode 模式字符的含义
Character Meaning
--------- ------------------------------------
'r' 以只读方式打开(默认)
'w' 以写方式打开,删除原有文件内容(如果文件不存在,则创建这个文件)
'x' 创建一个新文件,以写模式打开(如果文件已经存在,则会触发FileExistError)
'a' 以写模式打开,如果文件存在,则追加文件末尾
'b' 用二进制模式打开文件
't' 用文本模式打开文件(默认)
'+' 为更新内容打开一个磁盘文件(可读可写)
========= ====================================
python 文件操作的方法:
F 代表文件流对象
F.close() 关闭文件
F.readline() 读取一行数据,如果达到文件尾则返回空字符串
F.readlines(max_chars=-1) 返回每行字符串的列表, max_chars为最大字符(或字节)数
F.writelines(lines) 写入字符串列表到文件中
F.read(size=-1) 从一个文件流中读取size个字符(或字节)
F.write(s) 写一个字符串(或字节串)到文件中,返回写入的字符数(字节数)
F.tell() 返回当前文件流的绝对位置
F.seek(offset, whence=0) 改变数据流的位置,返回新的绝对位置
F.flush() 把写入文件对象的缓存内容写入到磁盘
二进制文件
什么是二进制文件
文件中以字节(byte)为单位存储,不以换行符(\n)为单位进行区分内容的读写方法
F.read() 返回类型 :
对于文本文件,F.read()返回类型为 字符串 (str)
对于二进制文件,F.read()返回类型为字节串(bytes)
字节串 bytes (也叫字节序列)
bytes类型的作用:
存储以字节为单位的数据
字节串是不可变的字节序列
说明:
字节是0~255(2**8-1)之间的整数
创建字的字节串字面值:
b = b''
b = b""
b = bytes() # b 为字空节串
创建非空字节串:
b = b'ABCD' # 有四个字节的字节串
b = b"1234"
b = b'\x41\x42' # b = b'AB'
字节串的构造(创建)函数
bytes() 生成一个空的字节串 等同于 b''
bytes(n) 生成n个值为0的字节串
bytes(字符串, encodeing='utf-8') 用字符串的转换编码生成一个字节串
bytes(整型可迭代对象) 用可迭代对象初始化一个字节串
示例:
b = bytes(10) # 10个0
b = bytes("ABCD", 'utf-8') # b = b'ABCD'
b = bytes("ABCD中文", 'utf-8') # ...
b = bytes(range(0x41, 0x41+26))
bytes 运算:
+ += * *=
< <= > >= == !=
in / not in
b = b"1234abcd"
b'a' in b # 对的
'1' in b # 错的
0x61 in b # 对的
300 in b # 错的
索引和切片 (与字符串的索引和切片完全相同)
序列相关的函数可以用于字节串:
len(x) max(x) min(x) ....
bytes 与 str 的区别
bytes 存储的是字节(0~255)
str 存储的是Unicode字符(0~65535)
bytes 与 str 转换
str ---> bytes
b = s.encode(encoding='utf-8') # encode编码
bytes --> str
s = b.decode(encoding=utf-8) # decode 解码
字节数组 bytearray
可变的字节序列
tuple --> list
bytes --> bytearray
bytearray 的构造函数
bytearray() 创建空的字节数组
bytearray(整数)
bytearray(字符串,encodeing='utf-8')
bytearray(整型可迭代对象)
bytearray(字节串)
操作:
同字节串相同
+ += * *=
< <= > >= == !=
in / not in
索引 / 切片
注:
字节数组可以索引和切片赋值,赋值规则同列表的赋值规则
示例:
ba = bytearray(b'ABCDEFG')
ba[1] = 0x31 # 索引赋值
ba[3::2] = [0x32, 0x33]
bytearray 的方法:
ba.clear() 清空
ba.append(n) 追加一个字节(n为0~255的整数)
ba.remove(value) 删除第一个出现的字节,如果没有出现则产生ValueError错误!!!!!
ba.reverse() 字节的顺序进行反转
ba.decode(encoding='utf-8')
ba.find(sub[,start[,end]])
python3 内建序列:
str, list, tuple, bytes, bytearray
python3 中可变的数据类型
list, dict, set, bytearray
标准输入输出文件
sys.stdin # 键盘(默认)
sys.stdout # 控制台终端
sys.stderr # 控制台终端
模块名:sys
示例见:
stdout.py
stdin.py
Linux/UNIX 下 Ctrl + d 输入文件结束符
Windows 下 Ctrl + z 输入文件结束
输出重定向:
$ ls -l > 1.txt
$ find . -name "passwd" 2> error.txt
输入重定向:
$ python3 stdin.py < input.txt
练习:
写一个程序,从键盘输入一段字符串,存入变量s
1.将此字符串转为字节串,绑定变量b,并打印出来
2. 打印字符串的字节串的长度
3. 将b字符串转换为字符串用s2绑定,判断s2与s是否相同
1. 把输入的内容存入文件中,在sublime text 3 中查看输入的内容是否与所输入相同
2. 把此文件复制到 windows 下。看能否能用记事本打开
问题:
十个汉字是多少个字节
答:
GBK: 20字节
UTF-8 30字节
GB18030 20~40个字节
汉字编码:
00000000 - 0
11111111 - 255
至少两字节
00000000 00000000 -> 0
11111111 11111111 -> 65535
只讲两种:
国标系列: GB18030(GBK(GB2312))
国际标准: UNICODE <==> UTF-8
GB2312-80编码:
1980年发布
用两个字节表示,编码范围(A1A1~FEFE)
包含汉字 6763个,和 682个全角字符
A1-FE (0xFE-0xA1+1)
GBK 编码:
1995年制订
用两个字节码,编码范围(8140~FEFE)(剔除7F) 共收录了21003个汉字
完全兼容 GB2312-80
GB18030-2005
2005 年制订收录了27533个汉字
用两个字节或四个字节进行编码
两字节部分完全兼空GBK,
81 30 xx xx
UNICODE 编码:
UNICODE16
16位统一编码(0~65535)
UNICODE32
32位统一编码(0~4294967295(2**32-1))
'A' 0x41 ASCII
'A' 0x0041 UNICODE16
'A' 0x00000041 UNICODE32
UTF-8(8-bit Unicode Transformation Format)
UNICODE <<----->> UTF-8 互转
0000 ~ 007F 一个字节(ASCII)
0080 ~ 07FF 二个字节(其它小语种)
0800 ~ FFFF 三个字节(汉字落在此区)
(具体算法参见wiki或百度百科)
python3 的 str 字符串(存UNICODE16 (0~65535)
Windows 默认用GB系列:
Linux/Unix/IOS/MAX OS X/Android 默认用UNICODE系列编码
Python 编码(encode)字符串
'gb2312'
'gbk'
'gb18030'
'utf-8'
'ascii'
str.encode(encodeing=xxxx)
编码注释:
在python源文件的第一行或第二行写入如下内容可设置
源文件的编码格式:
# -*- coding:utf-8 -*-
# 设置源码为utf-8编码
或
# -*- coding:gbk -*-
# 设置源码为gbk编码