1.文件操作的函数
open(文件名(路径), mode="?", encoding="字符集")
模式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b
r w a r+ b
文件路径:
1. 绝对路径,从磁盘的根目录寻找 或者 从互联网上寻找一个路径
2. 相对路径(用的多). 相对于当前程序所在的文件夹 ../返回上一层文件夹
f = open("哈哈哈哈哈", mode="r", encoding="UTF-8")
s = f.read()#如果在read()中加上数字表示读取几个字符
print(s)
f.close() # f.close(),每次执行完之后必须close, 否则在下面的程序中如果删除这个文件. 就会报错
这样读的弊端会占用大量的内存,如果文件过大的话会导致内训崩溃.
循环读取. 这种⽅式是最好的. 每次读取一行内容.不会产生内存溢出的问题.
f = open("../def/哇擦.txt", mode="r", encoding="utf-8")
for line in f:
print(line.strip())
f.close
read(n) 读取n个字符. 需要注意的是. 如果再次读取. 那么会在当前位置继续去读,而不
是从头读, 如果使用的是rb模式. 则读取出来的是n个字节.
readline() ⼀次读取⼀行数据, 注意: readline()结尾, 注意每次读取出来的数据都会有一
个\n 所以呢. 需要我们使用strip()方法来去掉\n或者空格
readlines将每一行形成一个元素,放到一个列表中,饭后将所有内容都读出来,所以也容易出现内存崩溃的问题。
f=open("文件名",mode="r",encoding="utf-8")
lst= f.readlines()
print(lst)
for el in lst:
print(el.strip())
rb.读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集. 它是 读取非文本文件,比如mp3,视频,图片等
写文件:
带w的. 只要你操作了. 就会清空源文件,
# 如果文件不存在. 会自动创建文件
f = open("小娃娃", mode="w", encoding="utf-8")
f.write("金毛狮王")
f.flush() # 刷新. 养成好习惯
f.close()
wb模式下. 可以不指定打开文件的编码. 但是在写文件的时候必须将字符串转化成utf-8的 bytes数据 f = open("小娃娃", mode="wb") f.write("金毛狮王".encode("utf-8")) f.flush() f.close()
追加(a, ab)
在追加模式下. 我们写入的内容会追加在文件的结尾
f = open("小娃娃", mode="a", encoding="utf-8")
f.write("麻花藤的最爱")
f.flush()
f.close()
读写模式(r+, r+b)
对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进行
写入.
f = open("小娃娃", mode="r+", encoding="utf-8") content = f.read() f.write("麻花藤的最爱") print(content) f.flush() f.close() 结果: 正常的读取之后, 写在结尾
r+模式下. 必须是先读取. 然后再写入
写读(w+, w+b)
先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常用
f = open("小娃娃", mode="w+", encoding="utf-8")
f.write("哈哈")
content = f.read()
print(content)
f.flush()
f.close()
a+ (追加)模式下, 不论先读还是后读. 都是读取不到数据的
相关操作
seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中文部分要
是3的倍数.
通常我们使用seek都是移动到开头或者结尾.
移动到开头: seek(0)
移动到结尾: seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移, 默认是0, 表
示开头, 1表示当前位置, 2表示结尾
f = open("hello", mode="r", encoding="utf-8")
# f.seek(3) # 3byte => 1中文
# s = f.read(1) # 读取一个字符
# print(f.tell()) # 表示光标在哪儿
# f.close()
# seek(偏移量, 位置)
# seek(0) # 开头
# seek(0,2) # 在末尾的偏移量是0 末尾
truncate()截断文件
f = open("小娃娃", mode="w", encoding="utf-8")
f.write("哈哈") # 写入两个字符
f.seek(3) # 光标移动到3, 也就是两个字中间
f.truncate() # 删掉光标后面的所有内容
f.close()
f = open("小娃娃", mode="r+", encoding="utf-8")
content = f.read(3) # 读取9个字符
f.seek(4)
print(f.tell())
f.truncate() # 后面的所有内容全部都删掉
# print(content)
f.flush()
f.close()
注意:在r+模式下,如果读取了内容,不论读了多少,光标显示多少,接着写入或者读取都是在末尾进行的。如果想进行截断操作,先把光标挪取到你要截断的部分,然后在进行截断。
文件修改:将文件中的内容读取到内存中,把需要改的信息修改完毕,然后将源文件删除,将新的文件改成旧的文件名。
import os
with open("小娃娃", mode="r", encoding="utf-8") as f1,\
open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
new_line = line.replace("大白梨", "冰糖葫芦")
f2.write(new_line)
os.remove("小娃娃") # 删除源⽂文件
os.rename("小娃娃_new", "小娃娃") # 重命名新文件
##############################内容补充#############################
1.文件缓冲区
open函数中的第三个参数是可选的buffering控制文件的缓冲,如果参数是0的话,表示没有缓冲,直接将参数写到硬盘上; 如果参数是1的话,操作是有缓冲的,先写到内存中,只有使用flush函数或者使用close函数的时候,才会将数据更新到硬盘中,如果参数大于1的话,则代表缓冲区的大小(单位是字节),-1(或者任意负数,)代表使用默认缓冲区的大小.
2.操作文件和目录
在Python中对文件和目录的操作,常用os模块和shutil
获取当前脚本工作的目录路径:os.getcwd()
返回指定目录下的所有文件和目录名:os.listdir() os.listdir("c:\\")
删除一个文件:os.remove(filepath)
删除多个空目录:os.removedirs(r'd:]python')
检测给出的路径是否是一个文件:os.path.isfile(filepath)
检测给出的路径是否是一个目录:os.path.isdir(filepath)
判断是否数绝对路径:os.path,isabs()
检测路径是否存在os.path.exists(), 检测D盘下是否有Python文件夹 os.path.exists(r"d:\python")
分离一个路径的目录名和文件名 os.path.split()
获取路径名:os.pathdirname(filepath)
获取文件名:os.path.basename(filepath)
读取和设置环境变量:os.getenv()和os.putenv()
当前平台使用的行终止符:os.linesep,Windows使用的是'\r\n',Linux使用的是\n,Mac使用\r
重命名文件或者目录os.rename(old new)
创建多级目录:os.makedirs(r"d:\python\text")
创建单个目录:os.makdir('text')
获取文件属性:os.stat(file)
修改文件的权限和时间戳:os.chmod(file)
获取文件的大小:os.path.getsize(filename)
复制文件夹:shutil.copytree("olddir","newfdir") olddir个newdir只能是文件,且newdir不能存在
复制文件:shutil.copyfile("oldfile","newfile") oldfile只能是文件,newfile可以是文件,也可以是目标目录
移动文件(目录):shutil.move("oldpos","newpos")
删除目录:os.rmdir('dir')只能删除空目录,shutil.rmtree("dir"),可以将空目录的和有内容的目录都能删除.