一、文件基础
1、⽂件的概念
l计算机的⽂件,就是存储在某种⻓期储存设备上的⼀段数据 ;
⻓期存储设备包括:硬盘、U 盘、移动硬盘、光盘 ;
⽂件的作⽤是可以将数据长期保存下来, 在需要的时候再使用。
二、⽂件的种类
1、⽂本⽂件
可以使⽤⽂本编辑软件查看;
例如:python 的源程序 ,txt 文本文件、doc、ppt、表格
2、 二进制⽂
二进制文章是以01方式进行存储的
保存的内容不是给⼈直接阅读的,⽽是提供给其他软件使⽤的
例如:图⽚⽂件、⾳频⽂件、视频⽂件等等 ;
⼆进制⽂件不能使⽤⽂本编辑软件查看。
三、⽂件操作流程
1. 操作⽂件的套路
⼀共包含三个步骤:
第一步:打开⽂件 ;
第二步:读、写⽂件 ;
读: 将⽂件内容读⼊内存 ;
写: 将内容写⼊⽂件 。
第三步:关闭⽂件 。
2. ⽂件的函数/⽅法
在 Python 中要操作⽂件需要记住 1 个函数和 3 个方法
open 函数,打开文件
open 函数负责打开⽂件,并且返回⽂件对象
如果⽂件存在------返回⽂件操作对象
如果⽂件不存在------出错 ;
read / write / close 三个⽅法都需要通过 ⽂件对象 来调⽤
read ⽅法 —— 读取⽂件
open 函数的第⼀个参数是要打开的⽂件名(⽂件名区分⼤⼩写) ;
read ⽅法可以⼀次性读取文件的所有内容 。
close ⽅法负责关闭⽂件,如果忘记关闭⽂件,会造成系统资源消耗,⽽且会影响到后续对⽂件的访问 。
四、文件操作案例
1、打开文件格式
f = open("指定文件路径",打开方式,缓存方式)案例
f = open("d:/py1/abc.txt","w")
f.close()2、打开文件操作
打开文件读写方式
r+:是以读写方式打开,但是如果文件不存在,就会报错
w+:是以读写方式打开,但是如果文件不存在,就会创建新文件;如果文件存在,则正常打开
read方法**
作用:是从打开的文件中读取内容
原理:read是通过移动指针来从文件中读取内容
读取文件
案例1
# 打 开文件
file = open(r"C:\file\temp\a.txt", "r")
# 读取文件
text = file.read() # 显示读取内容print(text)
# 关闭文件
file.close()案例:
#coding=utf-8
# 打开文件
file1 = open("D:/py1/a1.txt","r")
# 读取文件的内容
# 第一次读取文件的内容
str1 = file1.read()
# 第二次读取文件的内容
str2 = file1.read()
# 关闭文件
file1.close()
# 第一次读取文件内容,会正常输出,第二次执行read没有任何输出
# 因为第一次读取完成后,指针已经移动到了最后的位置
print(str1)
print(str2)案例:从磁盘的文件中读内容**
#coding=utf-8
# 打开文件
file1 = open("D:/py1/a2.txt","w+")
# 读取文件的内容
str = file1.read()
# 关闭文件
file1.close()
print(str)3、写入文件
write方法
作用:是向文件中写入内容
案例
# 打 开文件
file = open(r"C:\file\temp\b.txt", "w")
# 写入内容
str1 = "hello world\n"
file.write(str1)
str1 = "hello python\n"
file.write(str1)
# 关闭文 件
file.close()案例:向文件中写入内容
str1 = "hello boys\n"
str2 = "i am"
str3 = "zxhk\n"
str4 = "i come from hebei\n"
# 第一步:新建/打开文件
file = open("d:/py1/myfile.txt","a")
# 第二步:写入
file.write(str1)
file.write(str2)
file.write(str3)
file.write(str4)
# 第三步:关闭文件
file.close()案例:将myfile.txt 复制一个新文件afile.txt
# 打开两个
# myfile.txt 以只读打开,然后读取内容
f1 = open("d:/py1/myfile.txt","r")
# afile.txt 以写打开,
f2 = open("d:/py1/afile.txt","w")
# 然后将从myfile.txt读的内容写入到afile.txt
str = f1.read()
f2.write(str)
# 关闭文件
f1.close()
f2.close()4、文件打开方式
open 函数默认以只读⽅式打开⽂件,并且返回⽂件对象
1)r:以只读方式打开文件,文件的指针将会放在文件的开头。这是默认模式。
2)a:打开一个文件追加,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
3)w:以只写方式打开文件,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
4)rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等
5)ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
6)wb:以二进制格式打开一个文件用于只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
7)r+:打开一个文件用于读写。文件指针将会放在文件的开头
8)a+:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
9)w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
10)rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
11)ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
12)wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等
5、指定编码类型
file = open(文件名, 打开方式, encoding="编码")五、文件常用方法
1)read() :从文件中读取全部内容,读取后指针指向文件末尾
2)read(siza):读取指定的子节数,参数可选,无参或参数为负时读取所有
3)weite():向文件中写入内容
4)file.seek(offset[, whence]):将文件对象移动到指定的位置;offset 表示移动的偏移量;whence 为可选参数,值为 0 表示从文件开头起算(默认值)、值为 1 表示使用当前文件位置、值为 2 表示使用文件末尾作为参考点
5)readline():执行一次readline,就会从文件中读取一行出来
6)readlines():执行一次readlines,就会将文件中的全部内容读取出来,并保存成一个列表,一行就是一个元素
案例:让用户输入5个用户名,将用户名保存到文件中
f = open("d:/py1/name.txt","w")
for n in range(5):
name = input("please etner name: ")
str = name + "\n"
f.write(str)
f.close()案例::让用户一直输入保存到文件中,并把输入的内容中“a"改变成大写,输入到q退出程序。
f=open("c:/py1/abc3.txt","w+") #新建一个新的文件
while True: #衡循环
userInput = input("enter:") #用户输入内容
if userInput =="q"or userInput =="Q": #判断有没有q
break #有q就退出
f.write(userInput+"\n") #写入内容,换行
f.close() #关闭文件
f1=open("c:/py1/abc3.txt","r") #以只读的形式打开
f2=open("c:/py1/abc4.txt","w") #以只写的形式打开
li=f1.readlines() #逐行查看
for char in li: #遍历一下
f2.write(char.replace("a","A")) #逐个寻找“a"寻找到之后替换为“A”
f1.close() #关闭文件
f2.close() 案例:让用户可以重复的输入内容**
如果输入的不是q,就再输入一次
如果输入的是q,就停止输入,并将输入的内容中的小写a转换为大写
#第一步:先将输入的内容保存文件
# 首先打开文件
newFile = open("d:/py1/newfile1.txt", "a")
#向文件进行写入操作
while True:
# 让用户收入内容
userInput = input("请输入内容:")
# 判断用户输入的内容是否为q,如果是q,就通过
if userInput == "q":
break
newFile.write(userInput+"\n")
#保存文件
newFile.close()
#第二步:将文件中小写的a转大写,然后重新保存
# 首先打开文件
fileContent = open("d:/py1/newfile1.txt", "r")
lastFile = open("d:/py1/lastfile.txt", "w")
# 将内容的内容转换为一个列表
contentList = fileContent.readlines()
n = 0
maxN = len(contentList) - 1
# 遍历列表
while True:
# 获取文件的每一行的内容
str = contentList[n]
n += 1
# 小a转大a
str = str.replace("a","A")
# 将转换后的结果写入到新文件
lastFile.write(str)
if n > maxN:
break
# 遍历完成后,关闭文件
lastFile.close()
fileContent.close()六、读取内容
1、readline
readline 方法可以一次读取一行内容。
⽅法执⾏后,会把⽂件指针移动到下⼀⾏,准备再次读取
readline 方法读取到文件最后,返回长度为 0 的字符串””
案例:计算文件c.txt中一共有几行
file = open("d:/py1/c.txt","r",encoding="utf-8")
n = 0
while True:
str = file.readline()
if len(str) == 0:
break
n += 1
print(n)2、readlines
readline 方法可以一次读取全部内容,返回一个列表,内容的每一行是列的一个元素
# 打开文件
file = open(r"C:\file\temp\a.txt")
# text 类型为list,list 中每个成员就是文件a.txt 的每一行
text = file.readlines()
# 遍历列表text
for n in text:
# 显示text 每个成员内容
print(n) # 关闭文件file.close()七、open变种写法
# 原始方法
f = open("a.txt", "r")
text = f.read()
print(text)
f.close()
# 新写法 【不需要手动关闭文件,文件会自动关闭】
with open("a.txt", "r") as f:
text = f.read()
print(text)八、补充内容判断文件是否存在
import os
os.path.exists(文件名)返回值
True
false
案例1:让用户输入文件名,判断文件是否存在
import os
file=input("请输入文件名:")
if os.path.exists(file):
print("文件存在")文件重命名
os.rename("旧文件名","新文件名")获取指定目录下的所有文件名
os.listdir("指定路径")修改工作目录
os.chdir("目标目录")删除文件
os.remove("文件名")注意:如果是变量则不需要加变量,加上引号就是字符串
案例:将d:/py1中的所有的文件,添加一个后缀.bak
##################################################
files = os.listdir("d:/py1/")
for var in files:
odName = "d:/py1/" + var
newName = "d:/py1/" + var + ".bak"
os.rename(odName, newName)
###################################################
# 将工作目录修改为 d:/py1/
os.chdir("d:/py1/")
# 将py1下的所有的文件名保存成一个列表
fileList = os.listdir("./")
# 遍历修改文件名
for oldName in fileList:
newName = oldName + ".bak"
os.rename(oldName,newName)九、作业
作业:让用户输入文件名,将文件复制成源文件名.bak【a.txt a.txt.bak】
如果文件不存在,则让用户重新输入,最多输入4次
如果文件存在,还要检查复制的新文件是否存在
如果不不存在,则直接复制
如果存在,则询问用户是否覆盖
import os
for num in range(4):
file=input("请输入文件名:")#源文件
if os.path.exists(file):#判断用户输入的文件是否存在
print("文件存在")
newf=file+".bak"#给文件添加新的后缀.bak
if os.path.exists(newf):#判断新添加后缀的文件是否存在
print("是否要覆盖源文件,输入y或Y确认覆盖,输入n或N取消覆盖")#文件存在询问用户是否要覆盖文件
userInput=input("确认是否覆盖文件:")#让用户确认是否修改
if userInput=="y" or userInput=="Y":#确认修改
os.remove(newf)#删除原有的文件
os.rename(file, newf)#原地修改文件的名字
print("文件名修改成功")#提示修改成功
break
elif userInput=="n"or userInput=="N":#取消修改文件
print("取消覆盖文件")#提示取消修改文件
else:
print("输入错误")#输入的不是y或是n,则提示输入错误
else:
os.rename(file,newf)#文件不存在,直接替换文件名
break#停止循环
else:
print("文件不存在,请重新输入:")#提示用户文件不存在作业1【所有人】:读取一个文件,显示除了以井号(#)开头的行以外的所有行
file = open("c:/py1/abc3.txt","r")
str = file.readlines()
for var in str:
if var[0] == "#":
pass
else:
print(var)
file.close()十、数据序列化
1、概念
序列化:将一个任意的数据类型转换成python能识别和处理的字符串
逆序列化:将python能识别的字符串转换成对应的数据类型
序列化的目的:将数据类型保存到磁盘上,也可以实现将数据发生给另外一个主机
数据类型
字符串
整数
列表
元组
集合
字典
实现序列化的方法
pickle
json
2、pickle模块
序列化方法:pickle.dump()
逆序列化方法:pickle.load()
pickle.dump实现序列化
pickle.dump(要保存的对象, 文件名)案例:将字典实现保存到文件中
# 导入模块
import pickle
# 定义一个字典对象
nameList = {"tom":["hebei",18,"男"], "jerry":["tianjin",20,"女"]}
# 打开文件,打开方式 wb
file = open("d:/py1/c.pkl","wb")
# 用dump方法将字典写入到打开的文件中
pickle.dump(nameList, file)
# 关闭文件
file.close()pickle.load实现逆序列化
pickle.load(文件名)案例:从文件中读取字典类型保存的数据
import pickle
file = open("d:/py1/c.pkl","rb")
d1 = pickle.load(file)
file.close()
print(d1)注意:可以多次执行序列化和逆序列化,但是不建议这么做
3、json模块
json的特点
JSON 是纯文本;
JSON 便于阅读和编写;
JSON 具有清晰的层级结构;
有效地提升网络传输效率;
JSON 语法规则
大括号保存对象;
中括号保存数组;
对象数组可以相互嵌套;
数据采用键值对表示;
多个数据由逗号分隔;
JSON 值
数字(整数或浮点数);
字符串(在双引号中);
逻辑值(true 或 false);
数组(在中括号中);
对象(在大括号中);
{
"name": "tom",
"age": 18,
"isMan": true,
"school": null,
"address": {
"country": "中国",
"city": "河北",
"street": "石家庄"
},
"numbers": [2, 6, 8, 9],
"links": [
{
"name": "zaizhuo",
"url": "http://www.zaizhuo.cn"
},
{
"name": "载卓",
"url": "http://www.zaizhuo.com"
}
]
}读取json文件
json.load(json文件名)
写入jion文件
json.dump(data, f, ensure_ascii=False)
案例:读取json文件
# 导入模块
import json
# 打开文件
f = open('d:/py1/1.json', "r", encoding='UTF-8')
# 读取json文件
data = json.load(f)
# 返回的data 数据类型为字典或列表
print(data)
f.close()案例:写入json格式数据
import json
data = {'name': 'tom', 'age': 20, 'country': '中国'} f = open('temp.json', 'w', encoding='UTF-8') json.dump(data, f, ensure_ascii=False)
# ensure_ascii=False 代表中文不转义
f.close()