目录
文件 file
文件是用于数据存储的单位
文件通常用来长期存储数据
文件中的数据是以字节为单位进行顺序存储的
文件的操作流程
1.打开文件
2.读写文件
3.关闭文件
注:任何的操作系统,同一个应用程序同时打开文件的数量有最大数限制,所以在用完文件后需要关闭
文件的打开函数open
open(file,mode='rt')
用于打开一个文件,返回此文件流对象,如果打开文件失败,则会触发OSError错误
文件的关闭方法
F.close() 关闭文件,释放系统资源
# 此示例示意文件的打开,读取及关闭
try:
#第一步打开文件
f = open('day014.txt','rt')
print("打开文件成功!")
#第二步读取文件
s = f.read() #读取全部内容
print("文件中的内容是:",s)
#第三步关闭文件
f.close()
print("文件已关闭")
except OSError:
print("文件打开失败")
文本文件操作模式
模式字符:
't' (默认)
1.默认文件中存储的数据为字符数据,以行为单位分隔,在python内部统一用'\n'作为换行符进行分隔
2.对文本文件的读写需要用字符串(str)进行读取和写入数据
各操作系统的换行符:
Linux换行符: '\n'
Windows换行符: '\r\n'
旧的Macintosh换行符: '\r'
新的Mac OS换行符: '\n'
说明:
在文件模式下,各操作系统的换行符在读入python内部时转换为字符'\n'
练习:
自己写一个文件info.txt,内部存储一些文字信息如下:
小张 20 100
小李 18 98
小王19 95
写程序将这些数据读取出来,打印在屏幕终端上
def read_file_content():
L = []
try:
f = open('info.txt')
while True:
s = f.readline() # '小张 20 100\n'
if not s:
break
s2 = s.strip() # '小张 20 100'
name_age_score = s2.split() # ['小张', '20', '100']
n, a, s = name_age_score
d = {'name': n, 'age': int(a), 'score': s}
# d = {'name': '小张', 'age': 20, 'score': 100}
L.append(d)
f.close()
except OSError:
print('打开文件失败')
return L
if __name__ == '__main__':
docs = read_file_content()
print(docs)
文件的迭代读取:
open返回的文件流对象是可迭代对象
f = open('myfile.txt')
for line in f :
print(line)
文本文件的写操作:
写文件模式有:
'w'
'x'
'a'
详见:
文件.html
练习:
1.写一个程序,输入很多人的姓名,年龄,家庭住址信息,存入文件
infos.txt中
文件格式自己定义
完后输入后查看文件格式是否是你想要的格式(文本文件操作)
2.写一个程序读入infos.txt中的内容,以如下格式打印infos.txt中的内容
姓名: xxx, 年龄:20, 住址: xxxx
姓名: yyy, 年龄:18, 住址: yyyyy
二进制文件操作
默认的文件中存储的都是以字节为单位的数据,通常有人为规则的格式,需要以字节为单位进行读写
F.read() 的返回类型:
1.对于文本模式('t')打开的文件,返回字符串(str)
2.对于二进制模式('b')打开的文件,返回字节串(bytes)
F.write(x)
1.对于文本模式,x必须为字符串
2.对于二进制模式,x必须为字节串
以十六进制方式查看文件内容的命令:
$ xxd 文件名
file = open('data.bin', 'rb')
b = file.read(1) # 读取一个字节
print("第一个字节是:", b)
b = file.read() # 读取所有的字节
print('其它所有字节是: ', b)
file.close()
# 此示例示意以文本文件模式读取myfile.txt中的内容
try:
f = open("myfile.txt")
print('打开文件成功!')
# 读取文件内容
while True:
s = f.readline()
if s == '':
print('已经读取到了文件末尾')
break
print("读到这一行是:", s)
f.close()
except OSError:
print("打开文件失败")
# 此示例示意以文本文件模式读取myfile.txt中的内容
try:
f = open("myfile.txt")
print('打开文件成功!')
# 读取文件内容
# s = f.read()
s = f.read(3) # 读取三个字符
print('字符串s的长度是:', len(s), '内容是', s) # 'abc'
s2 = f.read(3)
print('第二次读取的字符是:', s2) # '123'
s3 = f.read(5)
print('第三次拿到的字符是:', s3) # '中文\nAB'
s4 = f.read()
print(s4) # 'C英文\nhello world\n'
f.close()
except OSError:
print("打开文件失败")
# 此示例示意以二进制方式写文件到'data.bin'
try:
f = open('data.bin', 'wb')
print("打开文件成功")
# 写入数据
b = b'\xe4\xb8\xad'
f.write(b)
f.write(b'\x00\x00')
f.close()
except OSError:
print("打开文件失败")
# 此示例示意写文本文件操作
f = open('mynote.txt', 'w') # 'w' 代表以写模式打开文件
f.write('你好')
f.write('中国!')
f.write('\n')
f.write("hello china!")
f.writelines(['aaaa\n', 'bbbb\n', 'cccc\n'])
f.close()
# 此示例示意写文本文件操作
f = open('mynote.txt', 'at') # 'a' 代表追加方式打开
f.write('我追加到了文件尾')
f.close()
练习:
将如下数据用二进制文件操作方式写入到文件data.txt中
数据如下:
小李13888888899
小王13666666666
b = str.encode('utf-8')
用sublime text3打开,看写入的内容能否被sublime识别并读出
name1 = '小李'
number1 = 13888888899
name2 = '小王'
number2 = 13666666666
file = open("data.txt", 'wb')
s = name1 + ' ' + str(number1) + '\n'
b = s.encode('utf-8')
file.write(b) # 写入第一行数据
s = name2 + ' ' + str(number2) + '\n'
b = s.encode('utf-8')
file.write(b) # 写入第二行数据
file.close()
F.seek() 函数
F.seek(偏移量,相对位置)
偏移量:
大于0的数代表向文件尾方向移动
小于0的数代表向文件头方向移动
相对位置:
0代表从文件头开始偏移
1代表从当前开始偏移
2代表从文件尾开始偏移
作用:
改变当前文件的读写位置
F.tell()函数:
作用:
返回当前文件读写位置
# 此示例示意 用F.seek方法来定位文件的读写位置
# 注: seek 通常对 二进制模式打开的文件进行操作
f = open('myfile.bin', 'rb')
print("刚打开文件时,文件的读写位置是:", f.tell()) #0
b = f.read(2)
print('刚读入的内容是:', b)
print('读取两个字节后的读写位置是:', f.tell()) # 2
# 想读取第五个字节开始的5个字节
# 定位
# f.seek(5, 0) # 从头开始向后移动5个字节的位置
# f.seek(3, 1) # 从当前的读写位置向后移动3个字节的位置
f.seek(-15, 2) # 从文件尾向前移动15个字节的位置
print("seek 移动后的读写位置是:", f.tell()) # 5
b = f.read(5) # 读取5个字节
print(b) # b'abcde'
f.close()
小结:
文件操作的两种模式:
'b' 二进制模式
't' 文本模式
文件操作:
读read/readline/readlines
写 write/writelines
汉子编码:
问题:
十个汉字占多少个字节:
只讲两种:
国标系列:
GB18030(二字节或四字节编码,共27533个汉字)
GBK(二字节编码,共21003个汉字)
GB2312(二字节编码,共6763个汉字)
国际标准:
UNICODE32(UNICODE16) <---> UTF-8
(Linux,Mac OS X,IOS,Android等常用)
说明:
python3的字符串内部都是用UNICODE来存储字符的
python 编码(encode) 字符串
'gb2312'
'gbk'
'gb18030'
'utf-8'
'ascii'
编码注释:
在python源文件第一行或第二行写入如下内容是告诉解释执行器
此文件的编码类型是什么
如:
# -*- coding: gbk -*-
# 设置源文件编码格式为gbk
或
# -*- coding: utf-8 -*-
# 设置源文件编码格式为utf-8
# -*- coding: gbk -*-
print("你好!")# 此示例示意gbk编码的源文件加上编码注释后
# 可以在python3下运行
练习:
1.写程序实现复制文件功能:
要求:
1) 多大的文件都能复制
2) 要能复制二进制文件
3) 要考虑关闭文件
如:
请输入源文件: ../day15.tar.gz
请输入目录文件: abc.tar.gz
已复制文件,文件长度是: ....
2.为学生信息管理项目添加两个功能
|9) 保存学生信息到文件(si.txt) |
|10) 从文件中读取学生数据(si.txt) |
(要求,每个功能只要有一个函数与之相对应)