day16
文件 File
什么是文件
文件是用于数据存储的单位
文件通常用来长期存储数据
文件中的数据是以字节(byte)为单位进行存储的
文件的操作流程:
1.打开文件
2.读/写文件
3.关闭文件
注:任何操作系统,一个应用程序同时打开文件的数量有最大数限制
文件的打开函数:
open(file, mode='rt') 用于打开一个文件,返回此文件对应的文件流对象,如果打开失败则会触发OSError错误
文件关闭的方法:
F.close #关闭文件,释放系统资源
示例:
file_open.py
#此示例示意文件打开和关闭的操作
try:
f = open("mycode.txt") #打开文件
print("文件打开成功!")
#读写文件
#关闭文件
f.close()
print("文件已关闭")
except OSError:
print("文件打开失败")
file_open_text.py
try:
f = open("mycode.txt") #打开文件
print("文件打开成功!")
#读写文件
s = f.readline() #读取一行 s = 'abcd\n'
print('len(s)=',len(s),'内空是',s)
s = f.readline() #z再读取一行 s = '1234'
print('len(s)=',len(s),'内空是',s)
s = f.readline() #读取第三行行 s = ''
print('len(s)=',len(s),'内空是',s)
# L = f.readlines()
# print(L) #文本全部转换为字符串存放在列表中
#关闭文件
f.close()
print("文件已关闭")
except OSError:
print("文件打开失败")
文本文件的操作:
文本文件的模式字符 't'
说明:
1.对文本文件的读写需要用字符串str进行读取和写入数据
2.默认文件中存储的都是字符(文字) 数据,再读写中会自动进行编码转换操作
3.以行为单位分隔,在python内统一'\n'作用换行符进行分隔
各操作系统的换行符:
Linux换行符: '\n'
Windows 换行符: '\r\n'
旧的Macintosh换行符: '\r'
新的Mac OS换行符: '\n'
文件流对象的常用方法见:
python_base_docs_html/文件.html
练习一:
自己写一个文件'info.txt'内部存一些文字信息如下:
张三 20 100
李四 21 96
小王 20 98
注:
以上信息用空格作为分隔符分开
写程序将这些数据读取出来,并以如下格式打印出来:
张三 今年 20 岁,成绩是:100
李四 今年 21 岁,成绩是:96
小王 今年 20 岁,成绩是:98
def read_info_txt():
rl = []
try:
f = open("info.txt")
L = f.readlines()
for line in L:
s = line.strip() #去掉左右两侧的空白字符
name, age, score = s.split()
age = int(age)
score = int(score)
rl.append({'name':name, 'age':age, 'score':score})
f.close()
return rl #返回列表
except OSError:
print("读取文件失败!")
L = read_info_txt()
print(L)
def print_info_txt(L):
for d in L:
print(d['name'],'今年',d['age'],'岁,成绩是:',d['score'])
print_info_txt(L)
pyhton文件的常用方法:
文本文件读方法:
F.readline()
F.readlines()
F.read([字符数或字节数])
文本文件的写方法:
模式字符串:'w' / 'x' / 'a'
F.write(字符串)
F.writelines(字符串列表)
示例见:
file_write_text.py
#如果不写第二个参数默认是: f = open("newfile",'rt')
try:
# f = open('mynewfile')
# f = open("/root/newlife.txt",'wt') #失败会抛出异常
# f = open('mynewfile.txt','w')
# f = open('mynewfile.txt','x') #如果文件已经存在,则报错
f = open('mynewfile.txt','a') #在原文件后面追加
print("打开成功")
#在此处进行写文件操作
f.write("hello")
f.write("word")
f.writelines(['123','abc','ABC'])
f.write("kaj")
f.close()
print("关闭文件成功!")
except OSError:
print("创建文件失败")
注:流是具有先后顺序的数据,依次能存入一些排好顺序的数据
文件的迭代读取:
文件流对象是可迭代对象,迭代过程将以换行符'\n'作为分隔符
依次获取
示例:
f = open('mynote.txt','rt')
for line in f: #f绑定的文件流对象是可迭代对象
print(line)
练习二:
1.写程序,读入任意行文字,当输入空行时结束输入
先将这些读入的文字存入列表中,然后将此列表中的内容存入到
'input.txt'中
2.写程序,从上题的input.txt中读取之前输入的数据,读取到
列表中,再加上行号进行输出
def read_input_txt():
L = []
while True:
line = input('请输入一行文字')
if not line:
break
L.append(line)
return L
L = read_input_txt()
print(L)
def write_txt():
try:
f = open('input.txt','w')
print("文件已创建")
for x in L:
f.write(x)
f.write('\n')
f.close()
print("文件已关闭")
except OSError:
print("创建文件失败")
write_txt()
# 2.写程序,从上题的input.txt中读取之前输入的数据,读取到
# 列表中,再加上行号进行输出
def read_txt(filename='input.txt'):
L1 = []
try:
fr = open('input.txt','rt')
for line in fr:
s = line.rstrip()
L1.append(s)
fr.close()
print("读取文件成功!")
except OSError:
print("打开文件失败!!")
return L1
def print_text(L):
for line_number,s in enumerate(L,1):
print(line_number,':',s)
if __name__ == '__main__':
print_text(read_txt())
标准输入输出文件:
sys.stdin 标准输入文件(默认为键盘设备,得到原始键盘输出)
ctrl + d 快捷键是让键盘输入文件结束符
sys.stdout 标准输出文件(默认屏幕终端)
sys.stderr 标准错误输出文件(默认为屏幕终端)
模块名: sys
说明:
1.标准文件不需要打开和关闭就可以使用
2.每一个python程序启动后都会有三个文件供我们使用
示例:
stdin.py
#此示例示意标准输入文件的用法
import sys
s = sys.stdin.readline()
print(s)
sys.stdin.close()
#关闭标准输入文件则input函数就不能用了
s2 = input("请输入:")
print(s2)
stdin2.py
import sys
s = sys.stdin.read()
print(s)
二进制文件操作:(把文件当成字节串进行操作)
模式字符:'b'
默认文件中存储的都是以字节为单位的数据,通常有人为的格式
对二进制文件的读写需要字节串(bytes)进行操作
常用操作方法:
F.read([字符数/字节数])
对文本文件,F.read()返回类型为字符串str
对二进制文件,F.read()返回类型为字节串btyes
F.write()
同上,对于二进制文件,写入数据为字节串btyes或字节数组bytearray
F.tell()方法
返回当前的文件流的读写位置(从0开始,以字节为单位)
#tell.py
#此示例示意tell方法的用法
f = open('20.txt','rb') #二进制方式打开
b = f.read(3)
print(b)
#请问当前读写位置在哪儿?
pos = f.tell() #返回读写位置
print("当前的读写位置:",pos) #3
b2 = f.read(1)
print("读一个字节后的读写位置是:",f.tell()) #4
f.close()
F.seek()方法
对二进制文件有效,文本文件为按行读取
作用:
设置文件读写位置
格式:
F.seek(偏移量,whence=相对位置)
偏移量
大于0代表文件尾方向移动
小于0代表文件头方向移动
相对位置
0代表从文件头开始偏移
1代表从当前位置开始偏移
2代表从文件尾开始偏移
示例见:
seek.py
f = open('20.txt','rb') #二进制方式打开
b = f.read(3) #读取了三个字节
print(b)
f.seek(5,0) #代表从文件头头向后移动5个字节
f.seek(2,1) #代表从当前位置向后移动两个字节
f.seek(-15,2) #代表从文件尾向前移动15个字节
b = f.read(5) #b'ABCDE'
f.close()
F.flush
作用:
强制将缓冲区上的内容强制写到磁盘上
# flush.py
f = open('myflush.txt','w')
f.write('aaaa')
while True:
f.write('aaaaaa'*100)
time.sleep(1)
print("写入一次")
s = input("请输如回车键继续:")
f.close()
汉字编码(两种)
问题:
十个汉字占多少个字节?
20个字节(GBK编码)
30个字节 (utf-8编码)
国标编码
GB18030(二字节或四字节编码,27533个字)
GBK(二字节编码 21003个字)
GB2312(二字节编码 6763个字)
(Windows上常用)
国际标准:
UNICODE <----> UTF-8
(Linux / Mac OS x / IOS / Android常用)
UTF-8 (8-bit Unicode Transformation Format)
python的编码(encode)字符串
'gb2312' 6000 个字
'gbk' 21000 个字
'gb18030' 27000 个字
'utf-8' 前提文件为utf-8编码
'ascii' 英文
编码注释:
在源文件中的第一行或第二行写入如下内容为编码注释
# -*- coding:gbk -*-
#设置源文件编码格式为:gbk
或
# -*- coding:utf-8 -*-
#设置源文件编码格式为:utf-8
作用:
告诉解释执行器,当前的.py文件的编码格式是什么
课后练习:
1.写程序,让用户输入一系列整数,当输入小于零的数时结束输入
(1)将这些数字存于列表中
(2)将列表中的数字写入到文件中numbers.txt
2.写程序,将上题的numbers.txt中的整数读入到内存中,形成列表,计算这些数中的最大值,最小值和他们的和
3.写程序,实现文件复制功能
要求:
(1)要考虑关闭文件问题
(2)要考虑超大文件复制问题
(3)要能赋值二进制文件(如:/user/bin/python3等文件)
4.将学生信息管理程序添加两个功能:
| 9) 保存信息到文件(si.txt) |
|10) 从文件中读取数据(si.txt) |