文件操作入门
单个文件读写:
下面这首诗存在一个txt文件里,文件路径为: “D:\文件集散地\白雪歌送武判官归京.txt” 。请将这首诗的前5句存到另一个txt文件里。
北风卷地白草折,胡天八月即飞雪。 忽如一夜春风来,千树万树梨花开。 散入珠帘湿罗幕,狐裘不暖锦衾薄。 将军角弓不得控,都护铁衣冷难着。 瀚海阑干百丈冰,愁云惨淡万里凝。 中军置酒饮归客,胡琴琵琶与羌笛。 纷纷暮雪下辕门,风掣红旗冻不翻。 轮台东门送君去,去时雪满天山路。 山回路转不见君,雪上空留马行处。
file1= open("D:\文件集散地\白雪歌送武判官归京.txt","r",encoding='utf-8')
#open("路径","打开方式",encoding='utf-8'指定编码格式,不然可能报错)
file2= open("D:\文件集散地\新建.txt","w")
for i in range(2):
line= file1.readline() #读一行
file2.write(line) #写入
file2.write(file1.read(8))
file2.flush() #把缓冲区的内容强行写入硬盘并清空缓冲区,用在close()之前,防止文件关闭的时候数据还没写完
file2.close()
file1.close()
基本读写操作
- 写
-
_.write("你想写的东西") #写入一行,并换行 _.writelines("你想写的东西") #把字符串原封不动写入,不会做任何其它操作
- 不能写入列表,只能写入字符串
-
- 读
-
_.read(size) #读size个字符,若不加size,默认读取整篇全读,不换行 _.readline() #读一行,返回列表[read(1),read(1),...] _.readlines() #整篇全读,返回列表[readline(),readline(),...]
-
上面有用到os模块吗?
没有,这些都是Python自带的
除了"r"和"w"还有多少种打开方式?
- 打开方式(只读/只写/又读又写)(句柄在开头/末尾)(覆盖式写/追加式写)(文件不存在则新建/报错)(二进制式)
a+
任何模式多个"+"都是又读又写,- r+ 读写,开头,报错,覆盖
- wb 任何模式多个"b"都是二进制式读取
- w 只写,开头,新建,覆盖
- a 末尾,新建,追加。PS:每次写入,句柄都会自动移回末尾
音乐、图片能用这种方式读写吗?
不能,要先以二进制的方式打开
mediaFile= open("路径","rb")
并且:TypeError: write() argument must be str, not bytes。所以:
New_mediaFile= open("路径","wb")
close()很容易忘记写,有没有能不写close的方法?
with open("D:\文件集散地\新建.txt","w") as file2:
for i in range(2):
line= file1.readline()
file2.write(line)
file2.write(file1.read(8))
file2.flush()
我觉得“忽如一夜春风来”这句诗太nice了,想再写一遍,但是句柄回不去,怎么办?
- file.seek()调整句柄
-
file.seek(移几个字符,从哪开始) #从哪开始: 0从开头(默认);1从当前位置;2从末尾-倒数
-
但!是! seek只有在 “rb” 二进制模式下才能来去自如地跳格,在非二进制的模式下只能从开头开始计算位置,而在utf-8模式下找不到开头所以根本用不了。
所以,抱歉,回不去了。
文件目录操作: 新建 / 拷贝 / 移动 / 删除 , 文件 / 文件夹
有文件夹目录如下:
- D:\文件集散地\data
- aaa
- 111文件夹
- 222文件夹
- 隐藏 .txt
- bbb
请将aaa文件夹原封不动移动到bbb文件夹下。同时,aaa文件夹中有一个txt文件,文件名未知,把该文件,拷贝到 bbb/111文件夹 下
import os
import shutil
file_in_aaa= os.listdir(r"D:\文件集散地\data\aaa")
for file in file_in_aaa :
if(os.path.splitext(file)[1]==".txt"): #返回的扩展名是有"."的
print(file)
shutil.copy(r"D:\文件集散地\data\aaa"+"\\"+file,r"D:\文件集散地\data\bbb")
shutil.move(r"D:\文件集散地\data\aaa",r"D:\文件集散地\data\bbb")
基本操作
-
新建文件夹(如果文件夹已存在?如果文件夹所属路径不存在?)
-
os.makedirs(r"D:\data") #文件夹已存在:报错;文件夹所属路径不存在:新建 os.mkdir(r'D:\23333333333\222') #文件夹已存在:报错;文件夹所属路径不存在:报错
-
-
拷贝
- 文件:
-
shutil.copyfile("旧","新,精准到文件名") #只能拷贝文件 shutil.copy("旧","新,精准到文件夹,文件名可要可不要") #只能拷贝文件
- 如果文件已存在:覆盖; 如果路径不存在:报错;如果两个路径是同一个:报错;
-
- 文件夹:
-
shutil.copytree(r"D:\data",r"D:\data\test") #把data文件夹拷贝到data下,并重命名为test
- 如果文件夹已存在:报错;如果路径不存在:新建;如果两个路径是同一个:相当于文件夹已存在;
-
shutil.copytree(r"D:\data",r"D:\data\test\自我复制的死循环") # shutil.copytree(r"D:\data",r"D:\data\test") #为什么这样不会报错,加一层就会报错?树的先序遍历 # 只要避免那个目标文件夹被压进栈里,就不会死循环
-
- 文件:
-
移动:
-
shutil.move("旧","新")
- 如果路径不存在:新建-只针对文件夹的移动;如果两个路径是同一个:重命名,资源管理器甚至会实时刷新;
- !!!如果你想把一个文件移到一个不存在的文件夹里,就会出错,但是不会报错。
- “新”-这个目标路径可以有两个含义,一个是新建文件夹,一个是把文件夹迁移到这个目录底下。程序运行时取的是哪个含义,取决于这个路径存不存在。
- 如果迁移到的目录下有同名文件,就会报错
-
-
删除:
-
os.remove("路径") #文件 shutil.rmtree("路径") #文件夹
- 如果路径不存在:报错
- OS模块里也有能够移除文件夹的函数,但是只能移除空文件夹
-
问题时间 |
目标路径不存在时会报错的是哪几个函数?
shutil.mkdir()
shutil.rmtree()
os.remove()
shutil.move("文件","不存在的路径")
哪几个函数是OS模块里的?
os.mkdir()
os.makedirs()
唯一一个会覆盖同名文件而不会报错的函数是哪一个?
shutil.copy()
shutil.copyfile()