1 文件
1.1 定义
文件是用于数据存储的单位,通常用于长期存储数据
1.2 文件分类
linux/unix下文件可分为普通文件和设备文件
普通文件是由文件名和文件中的数据两部分组成的(通常文件名和文件数据是分开的)
1.3 文件的打开和关闭
文件需要在使用时先打开才能读写
在不需要读写文件时,应及时关闭文件以释放系统资源(内存和硬盘)
任何操作系统,打开文件数有最大限制
1.3.1 打开文件函数
open(file,mode=’r’)
用于打开一个文件,返回此文件的操作对象,如果打开失败会触发错误,抛出异常 FileNotFoundError
1.3.2 打开文件的模式mode
‘r’ 以只读方式打开文件(默认)
‘w’ 以只写方式打开文件,删除原有文件内容(如果文件不存在,则创建文件并以只写方式打开文件),打开之后的文件可以一直写入,直到关闭
‘x’ 创建 一个新的文件,并以写模式打开文件,如果文件存在则会产生FileExistsError错误
‘a’以追加写方式打开一个文件,如果有原有文件则追加到原有文件末尾
‘b’用二进制模式打开
‘t’用文本文件模式打开(默认)
‘+’为更新内容打开一个磁盘文件(可读可写)
注:缺省模式是‘rt’(reading text)
‘w+b’可以实现二进制的随机读写
‘r+b’以二进制只读形式打开文件,打开文件时不会清空文件内容
‘r+’ 以文本模式打开文件,打开文件时不清空文件内容,可以对文件进行写操作
1.3.3 关闭文件方法:
F.close() #关闭文件,释放系统资源
1.4 文本文件常用方法:
f.readline()
读取一行数据,如果到达文件末尾则返回空行,字符串包含行尾
f.readlines([n])
返回每行字符串的列表,n代表最大字符数(字节数),一般不采取此种方法
f.write(x)
将数据(字符/字节)写入文件中
f.writelines(lines)
把字符列表写入文件,列表是一个元素或者多个元素
f.flush()
把写入文件对象的缓存内容写入磁盘
(磁盘存数据是按照4k空间存数据,每次哪怕写一个字符也是占用4k空间,所以要用flush方法,把一堆东西写入磁盘)
1.4.1 读文件示例
date.txt文件
张某 1333333333333
李某 155555555555
王某 130888889999
f = open('date.txt')
while True:
s = f.readline().strip()
if s == '':
break
l = s.split(" ")
print('姓名:',l[0],'电话:',l[1])
f.close()
执行结果
姓名:张某电话: 1333333333333
姓名:李某电话: 155555555555
姓名:王某电话: 130888889999
f = open('date.txt')
L = f.readlines()
for x in L:
s = x.strip()
l = s.split()
print('姓名:',l[0],'电话:',l[1])
f.close()
执行结果
姓名:张某电话: 1333333333333
姓名:李某电话: 155555555555
姓名:王某电话: 130888889999
2 二进制文件
bytes类型 和 bytearray类型
二者可以相互转换
汉字编码
2.1 bytes类型
2.1.1作用:
以字节为单位存储数据,每个字节的值为0~255
字节串可以看做是序列
字节串是不可变的
2.1.2 bytes常量的表达方式:
bytes是ASCII编码
b’’ 空字节串
b’ABCD’ 有四个字节的字节串
b’\x41\x42’ 有2个字节的字节串(ASCII显示为我们看的懂得)
2.2 算术运算
+,+=,*,*=
2.3 比较,in/not inindex slice运算
<,>,<=,>=,==,!=
b”\xfe” < b”\xFF” 大小写无关,且通常都是十六进制,方便
in/not in
index
slice
>>> B = b'ABCD'
>>> b'D' in B
True
注意 b开头
‘\0’ 表示十进制的0
2.4 bytes相关的函数:
len(x)
max(x)
min(x)
sum(x)
any(x)
all(x)
2.5 创建字节串的函数
bytes() 创建空的字节串
bytes(整数)
bytes(整型可迭代对象)
bytes(字符串,encoding=‘utf-8’)
>>> bytes()
b''
>>> bytes(10)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> bytes([0x41,0x62,99,100])
b'Abcd'
>>> bytes(range(65,65+26))
b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> bytes('ABCD','utf-8')
b'ABCD'
>>> bytes('ABC中','utf-8')
b'ABC\xe4\xb8\xad'
2.6 bytes和str的转换
2.6.1 str--------> bytes
str.encode(encoding=’utf-8’)方法来转换
>>> string = 'ABC中'
>>> B = string.encode(encoding='utf-8')
>>> B
b'ABC\xe4\xb8\xad'
2.6.2 bytes------------>str
B.decode(encoding=’utf-8’)
>>> B=b'ABC\xe4\xb8\xad'
>>> B.decode(encoding='utf-8')
'ABC中'
3 二进制文件的读写
3.1 定义
文件中以字节为单位存储,不以换行符(\n)为单位分隔内容的文件
3.2 二进制文件操作方法
F代表文件
F.read(size=-1) 从一个文件流中最多读取size个字符
方法的返回类型:
对于文本文件,返回字符串
对于二进制文件,返回字节串(字节序列)
F.write(字符串/字节串) 写入一些数据到文件流中,返回写入的字节数(字符数)(返回字节数/字符数是为了防止部分写入)
F.tell() 返回当前文件流的绝对位置
F.seek(cookie,whence=0) 改变数据流的位置,返回新的绝对值
F.seek(‘偏移量’,whence=相对位置)
偏移量:
大于0的数代表向文件尾方向移动
小于0代表向文件头移动
相对位置:
0代表从文件头开始偏移
1代表从当前位置开始偏移
2代表从文件尾开始偏移
mytell.bin文件中
ABCDEFGHIJ1234567890
f = open('mytell.bin','rb')
print('f.tell返回',f.tell())
f.seek(10,0) #从头开始,向右偏移10个位置
f.seek(5,1) #从当前位置向右偏移5个位置
f.seek(-10,2) #从文件的结尾向头偏移10个位置
b = f.read(5)
print(b)
print('f.tell返回',f.tell())
f.close()
执行结果
f.tell返回 0
b'12345'
f.tell返回 15
F.readable() 判断这个文件是否可读,可读返回True
F.writable() 判断这个文件是否可写 可写返回True
3.3 示例
示例1
f = open('stu_infos.txt', 'r')
s = f.read()
print(s)
print('length:',len(s))
f.close()
name:bob age:30 score:90
name:lucy age:25 score:99
length: 50
示例2
f = open('stu_infos.txt', 'rb')
s = f.read()
print(s)
print('length:',len(s))
f.close()
# b'name:bob age:30 score:90\nname:lucy age:25 score:99'
# length: 50
4 bytearray类型
bytes类型为不可变类型
bytearray类型为可变的数据类型
4.1 操作
+,+=,*,*=
<,>,<=,>=,!=,==
in /not in
index
slice
4.2 bytearray方法
增 append
删 remove clear
改slice index
查find
反转 reverse
bytearray转 str decode
B.append(n)
追加一个字节(n为0~255的整数)
B.remove(value)
删除第一次出现的字节,如果没有出现,则产生valueError错误
B.clear()
清空
B.find(sub[,start[,end]])
bytearr.find(bytearray(b’3c’))
查找sub子字节
B.reverse()
字节顺序进行反转
B.decode(encoding=’utf-8’)
将字节码转换给字符串
4.3 创建bytearray的函数
bytearray() 创建空的字节串
bytearray (整数)
bytearray (整型可迭代对象)
bytearray(字符串,encoding=‘utf-8’)
>>> bytearray()
bytearray(b'')
bytearray(10)
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> bytearray(range(65,91))
bytearray(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
bytearray("ABCD中文",'utf-8')
bytearray(b'ABCD\xe4\xb8\xad\xe6\x96\x87')
4.4 课上练习
有一个bytearray字节序列:ba = bytearray(b'a1b2c3d4')
如何得到字符串‘1234’ 和 ‘abcd’
将上述bytearray转为bytearray(b'A1B2C3D4')
ba = bytearray(b'a1b2c3d4')
byte1 = ba[1::2]
byte2 = ba[0::2]
string1 = byte1.decode(encoding='utf-8')
string2 = byte2.decode(encoding='utf-8')
ba[0::2]= bytearray(b'ABCD')
print(string1)
print(string2)
print(ba)
执行结果
1234
abcd
bytearray(b'A1B2C3D4')
5 标准输入输出文件
sys.stdin
sys.stdout
sys.stderr
一个标准输入文件,两个标准输出文件
import sys
sys.stdout.write('你好')
执行结果
你好
1.1 定义
文件是用于数据存储的单位,通常用于长期存储数据
1.2 文件分类
linux/unix下文件可分为普通文件和设备文件
普通文件是由文件名和文件中的数据两部分组成的(通常文件名和文件数据是分开的)
1.3 文件的打开和关闭
文件需要在使用时先打开才能读写
在不需要读写文件时,应及时关闭文件以释放系统资源(内存和硬盘)
任何操作系统,打开文件数有最大限制
1.3.1 打开文件函数
open(file,mode=’r’)
用于打开一个文件,返回此文件的操作对象,如果打开失败会触发错误,抛出异常 FileNotFoundError
1.3.2 打开文件的模式mode
‘r’ 以只读方式打开文件(默认)
‘w’ 以只写方式打开文件,删除原有文件内容(如果文件不存在,则创建文件并以只写方式打开文件),打开之后的文件可以一直写入,直到关闭
‘x’ 创建 一个新的文件,并以写模式打开文件,如果文件存在则会产生FileExistsError错误
‘a’以追加写方式打开一个文件,如果有原有文件则追加到原有文件末尾
‘b’用二进制模式打开
‘t’用文本文件模式打开(默认)
‘+’为更新内容打开一个磁盘文件(可读可写)
注:缺省模式是‘rt’(reading text)
‘w+b’可以实现二进制的随机读写
‘r+b’以二进制只读形式打开文件,打开文件时不会清空文件内容
‘r+’ 以文本模式打开文件,打开文件时不清空文件内容,可以对文件进行写操作
1.3.3 关闭文件方法:
F.close() #关闭文件,释放系统资源
1.4 文本文件常用方法:
f.readline()
读取一行数据,如果到达文件末尾则返回空行,字符串包含行尾
f.readlines([n])
返回每行字符串的列表,n代表最大字符数(字节数),一般不采取此种方法
f.write(x)
将数据(字符/字节)写入文件中
f.writelines(lines)
把字符列表写入文件,列表是一个元素或者多个元素
f.flush()
把写入文件对象的缓存内容写入磁盘
(磁盘存数据是按照4k空间存数据,每次哪怕写一个字符也是占用4k空间,所以要用flush方法,把一堆东西写入磁盘)
1.4.1 读文件示例
date.txt文件
张某 1333333333333
李某 155555555555
王某 130888889999
f = open('date.txt')
while True:
s = f.readline().strip()
if s == '':
break
l = s.split(" ")
print('姓名:',l[0],'电话:',l[1])
f.close()
执行结果
姓名:张某电话: 1333333333333
姓名:李某电话: 155555555555
姓名:王某电话: 130888889999
f = open('date.txt')
L = f.readlines()
for x in L:
s = x.strip()
l = s.split()
print('姓名:',l[0],'电话:',l[1])
f.close()
执行结果
姓名:张某电话: 1333333333333
姓名:李某电话: 155555555555
姓名:王某电话: 130888889999
2 二进制文件
bytes类型 和 bytearray类型
二者可以相互转换
汉字编码
2.1 bytes类型
2.1.1作用:
以字节为单位存储数据,每个字节的值为0~255
字节串可以看做是序列
字节串是不可变的
2.1.2 bytes常量的表达方式:
bytes是ASCII编码
b’’ 空字节串
b’ABCD’ 有四个字节的字节串
b’\x41\x42’ 有2个字节的字节串(ASCII显示为我们看的懂得)
2.2 算术运算
+,+=,*,*=
2.3 比较,in/not inindex slice运算
<,>,<=,>=,==,!=
b”\xfe” < b”\xFF” 大小写无关,且通常都是十六进制,方便
in/not in
index
slice
>>> B = b'ABCD'
>>> b'D' in B
True
注意 b开头
‘\0’ 表示十进制的0
2.4 bytes相关的函数:
len(x)
max(x)
min(x)
sum(x)
any(x)
all(x)
2.5 创建字节串的函数
bytes() 创建空的字节串
bytes(整数)
bytes(整型可迭代对象)
bytes(字符串,encoding=‘utf-8’)
>>> bytes()
b''
>>> bytes(10)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> bytes([0x41,0x62,99,100])
b'Abcd'
>>> bytes(range(65,65+26))
b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> bytes('ABCD','utf-8')
b'ABCD'
>>> bytes('ABC中','utf-8')
b'ABC\xe4\xb8\xad'
2.6 bytes和str的转换
2.6.1 str--------> bytes
str.encode(encoding=’utf-8’)方法来转换
>>> string = 'ABC中'
>>> B = string.encode(encoding='utf-8')
>>> B
b'ABC\xe4\xb8\xad'
2.6.2 bytes------------>str
B.decode(encoding=’utf-8’)
>>> B=b'ABC\xe4\xb8\xad'
>>> B.decode(encoding='utf-8')
'ABC中'
3 二进制文件的读写
3.1 定义
文件中以字节为单位存储,不以换行符(\n)为单位分隔内容的文件
3.2 二进制文件操作方法
F代表文件
F.read(size=-1) 从一个文件流中最多读取size个字符
方法的返回类型:
对于文本文件,返回字符串
对于二进制文件,返回字节串(字节序列)
F.write(字符串/字节串) 写入一些数据到文件流中,返回写入的字节数(字符数)(返回字节数/字符数是为了防止部分写入)
F.tell() 返回当前文件流的绝对位置
F.seek(cookie,whence=0) 改变数据流的位置,返回新的绝对值
F.seek(‘偏移量’,whence=相对位置)
偏移量:
大于0的数代表向文件尾方向移动
小于0代表向文件头移动
相对位置:
0代表从文件头开始偏移
1代表从当前位置开始偏移
2代表从文件尾开始偏移
mytell.bin文件中
ABCDEFGHIJ1234567890
f = open('mytell.bin','rb')
print('f.tell返回',f.tell())
f.seek(10,0) #从头开始,向右偏移10个位置
f.seek(5,1) #从当前位置向右偏移5个位置
f.seek(-10,2) #从文件的结尾向头偏移10个位置
b = f.read(5)
print(b)
print('f.tell返回',f.tell())
f.close()
执行结果
f.tell返回 0
b'12345'
f.tell返回 15
F.readable() 判断这个文件是否可读,可读返回True
F.writable() 判断这个文件是否可写 可写返回True
3.3 示例
示例1
f = open('stu_infos.txt', 'r')
s = f.read()
print(s)
print('length:',len(s))
f.close()
name:bob age:30 score:90
name:lucy age:25 score:99
length: 50
示例2
f = open('stu_infos.txt', 'rb')
s = f.read()
print(s)
print('length:',len(s))
f.close()
# b'name:bob age:30 score:90\nname:lucy age:25 score:99'
# length: 50
4 bytearray类型
bytes类型为不可变类型
bytearray类型为可变的数据类型
4.1 操作
+,+=,*,*=
<,>,<=,>=,!=,==
in /not in
index
slice
4.2 bytearray方法
增 append
删 remove clear
改slice index
查find
反转 reverse
bytearray转 str decode
B.append(n)
追加一个字节(n为0~255的整数)
B.remove(value)
删除第一次出现的字节,如果没有出现,则产生valueError错误
B.clear()
清空
B.find(sub[,start[,end]])
bytearr.find(bytearray(b’3c’))
查找sub子字节
B.reverse()
字节顺序进行反转
B.decode(encoding=’utf-8’)
将字节码转换给字符串
4.3 创建bytearray的函数
bytearray() 创建空的字节串
bytearray (整数)
bytearray (整型可迭代对象)
bytearray(字符串,encoding=‘utf-8’)
>>> bytearray()
bytearray(b'')
bytearray(10)
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> bytearray(range(65,91))
bytearray(b'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
bytearray("ABCD中文",'utf-8')
bytearray(b'ABCD\xe4\xb8\xad\xe6\x96\x87')
4.4 课上练习
有一个bytearray字节序列:ba = bytearray(b'a1b2c3d4')
如何得到字符串‘1234’ 和 ‘abcd’
将上述bytearray转为bytearray(b'A1B2C3D4')
ba = bytearray(b'a1b2c3d4')
byte1 = ba[1::2]
byte2 = ba[0::2]
string1 = byte1.decode(encoding='utf-8')
string2 = byte2.decode(encoding='utf-8')
ba[0::2]= bytearray(b'ABCD')
print(string1)
print(string2)
print(ba)
执行结果
1234
abcd
bytearray(b'A1B2C3D4')
5 标准输入输出文件
sys.stdin
sys.stdout
sys.stderr
一个标准输入文件,两个标准输出文件
import sys
sys.stdout.write('你好')
执行结果
你好