2022.11.16 本学习内容总结于莫烦python:4.文件管理
https://mofanpy.com/tutorials/python-basic/interactive-python/read-write-file
4 文件管理
4.1 读写文件
均是用特殊字符open
4.1.1 创建文件
f = open("new_file.txt", "w") # 创建并打开
f.write("some text...") # 在文件里写东西
f.close() # 关闭
w
是写权限,会有相应的读等等(后面讲)…
- 创建的位置:保存在你脚本的当前目录下
|- me.py
|- new_file.txt
- 写入内容
with open("new_file2.txt", "w") as f:
f.writelines(["some text for file2...\n", "2nd line\n"])
4.1.2 读文件
w
改成 r
。 也就是说,其实 w
代表的是 write
, r
代表的是 read
f = open("new_file2.txt", "r")
print(f.read())
f.close()
some text for file2...
2nd line
- 如果是列表,我们读出来还想是列表,记录列表当中的一个值,可以用
writelines()
,那么在读文件的时候, 也可以readlines()
直接读出来一个列表
with open("new_file2.txt", "r") as f:
print(f.readlines())
['some text for file2...\n', '2nd line\n']
输出是个列表【】
- 大数据下,一行一行读取,取代一次性读取
with open("new_file2.txt", "r") as f:
while True:
line = f.readline()
print(line)
if not line:
break
【知识点】
open()
函数打开的文件,在操作完成之后,一定要调用close()
函数将其关闭吗?答案是肯定的。文件在打开并操作完成之后,就应该及时关闭,否则程序的运行可能出现问题。- 使用
with open()
,不需要写close
语句,默认自动帮我们关闭文件
参考:
http://c.biancheng.net/view/4770.html
https://www.cnblogs.com/annatest/p/13092135.html
4.1.3 文件编码,中文乱码
原文件的编码,通常来说是 utf-8、gbk、gb2312其中的某一种。
文件在 Windows 存储的时候,是以 gbk 的格式存储的
with open("chinese.txt", "wb") as f:
f.write("这是中文的,this is Chinese".encode("gbk"))
-
wb
,意思是write binary
(二进制写)形式,取代默认的text
形式 -
读的时候 要制定编码,不然打不开或乱码
with open("chinese.txt", "rb", ) as f:
#print(f.read()) # 乱码
print(f.read().decode('gbk')) # windows在本机尝试,可以试试这个
# 下面的代码会报错
with open("chinese.txt", "r") as f:
print(f.read())
#可以
with open("chinese.txt", "r", encoding="gbk") as f:
print(f.read())
这是中文的,this is Chinese
4.1.4 更多读写模式
with open("new_file.txt", "r") as f:
print(f.read())
with open("new_file.txt", "r+") as f:
f.write("text has been replaced")
f.seek(0) # 将开始读的位置从写入的最后位置调到开头
print(f.read())
some text...
text has been replaced
- 这里一定要有
.seek(0)
,不然光标在文档末尾,第六行的print(f.read())
没有输出 - 如果没有
print(f.read())
: -
- 第一遍输出:some text… 是因为只有第二行的有输出:
print(f.read())
,但其实内容输出后已经更改
- 第一遍输出:some text… 是因为只有第二行的有输出:
-
- 第二遍运行,会输出第二行语句的输出:text has been replaced;
4.2 文件目录管理
4.2.1 OS库
os库是Python自带的一个非常有用的模块。如果你做一个系统性的东西,要处理文件输出,读入等问题, 那么你有80%概率会使用到os库中的一些功能。
- ① 文件目录操作
os.getcwd()、 os.listdir()
import os
print("当前目录:", os.getcwd())
print("当前目录里有什么:", os.listdir())
当前目录: /home/pyodide
当前目录里有什么: ['files']
- ② 创建文件夹
os.makedirs
os.makedirs("project", exist_ok=True)
print(os.path.exists("project"))# 这句话是用来检测是否存在的,创建只是上面那句
4.2.2 文件管理系统
- 删除
shutil.rmtree()
用户注册了我这个系统,我得为这个用户创建一个他的文件夹。如果用户注销了,我是不是得把它的文件夹删掉?文件夹里有文件,不为空,就会报错的: 因为文件写了Nothing
os.makedirs("user/mofan", exist_ok=True)
with open("user/mofan/a.txt", "w") as f:
f.write("nothing")
os.removedirs("user/mofan") # 这里会报错
这种事情,需要用到另一个库,名字叫做 shutil.rmtree()
,它可以清空整个目录(递归地删除文件)
import shutil
shutil.rmtree("user/mofan")
print(os.listdir("user"))
[]
shutil.rmtree()
#递归地删除文件
- 改名
os.rename()
os.makedirs("user/mofan", exist_ok=True)
os.rename("user/mofan", "user/mofanpy")
print(os.listdir("user"))
['mofanpy']
4.2.3 文件目录多种检验
- 创建文件a.txt,并写上内容nothing
import os
os.makedirs("user/mofan", exist_ok=True)
with open("user/mofan/a.txt", "w") as f:
f.write("nothing")
- 进行不同的判断
判断是否是文件夹 是否是文件
print(os.path.isfile("user/mofan/a.txt")) # True
print(os.path.exists("user/mofan/a.txt")) # True
print(os.path.isdir("user/mofan/a.txt")) # False
print(os.path.isdir("user/mofan")) # True
- 创建文件副本
① 先拿到文件名 os.path.basename
② 再拿文件夹名 os.path.dirname
③ 为副本重命名
④ 把目录重新组合 os.path.join
import os
import shutil
def copy(path):
filename = os.path.basename(path) # 文件名
dir_name = os.path.dirname(path) # 文件夹名
new_filename = "new_" + filename # 新文件名
new_path = os.path.join(dir_name, new_filename) # 目录重组
shutil.copy2(path, new_path) # 复制文件
return os.path.isfile(new_path), new_path
copied, new_path = copy("user/mofan/a.txt")
if copied:
print("copied to:", new_path)
else:
print("copy failed")
os.path.join()
:目录拼接:https://blog.csdn.net/swan777/article/details/89040802
>>> import os
>>> print(os.path.join('path','abc','yyy'))
path\abc\yyy
shutil.copy2()
: Python中的方法用于将源文件的内容复制到目标文件或目录。此方法与shutil.copy()方法,但它还会尝试保留文件的元数据。
- 代替拿文件名和文件夹名
def copy(path):
dir_name, filename = os.path.split(path)
new_filename = "new2_" + filename # 新文件名
new_path = os.path.join(dir_name, new_filename) # 目录重组
shutil.copy2(path, new_path) # 复制文件
return os.path.isfile(new_path), new_path
copied, new_path = copy("user/mofan/a.txt")
if copied:
print("copied to:", new_path)
else:
print("copy failed")