1.1 文件夹与文件路径
d:\python\1.py
- 路径是:d:\python
- 文件是:1.py
1.1.1 绝对路径与相对路径
- 绝对路径:从根目录开始的路径
- 相对路径:从当前工作目录开始的路径
相对路径几个特殊的文件名:
-
.
一个点表示当前文件夹 -
..
两个点表示父级文件夹
1.2 os模块与os.path模块
与文件和路径相关的一般用这两个模块。
1.2.1 获取当前工作目录
>>> import os
>>> os.getcwd() # 获取当前工作目录
'/home/fish'
1.2.2 获取绝对路径
可以通过这个方法把文件或文件夹转换为绝对路径
>>> os.path.abspath(".")
'/home/fish'
>>> os.path.abspath("..")
'/home'
>>> os.path.abspath("hello.py")
'/home/fish/hello.py'
1.2.3 获取相对路径
os.apth.relpath(目标路径, 起点路径)
- 返回从启点路径到目标路径的相对路径
>>> os.path.relpath("/etc", "/home/fish/app")
'../../../etc'
1.2.4 检查路径
以下方法在:os.path模块中
函数 | 功能 |
exists(path) | 文件或文件夹存在返回真 |
isabs(path) | 是绝对路径返回真 |
isdir(path) | 是目录返回真 |
isfile(path) | 是文件返回真 |
>>> os.path.exists('/etc')
True
>>> os.path.isabs('1.txt')
False
>>> os.path.isdir('/etc/fstab')
False
>>> os.path.isfile('/etc/fstab')
True
1.2.5 文件与目录的操作
以下函数在os模块
函数 | 功能 |
mkdir(path) | 建立一级目录 |
makedirs(path) | 建立多级目录 |
rmdir(path) | 删除空目录 |
remove(file) | 删除文件 |
chdir(path) | 改变工作目录 |
import os
dir_name = "abc"
if not os.path.exists(dir_name):
os.mkdir(dir_name)
print("创建成功")
if os.path.exists(dir_name):
os.rmdir(dir_name)
print("删除成功")
if os.path.exists('log.txt'):
os.remove("log.txt")
print("删除文件成功")
print("当前的工作目录是:", os.getcwd())
os.chdir("d:\\")
print("当前的工作目录是:", os.getcwd())
1.2.6 合并路径
os.path.join(参数1,参数2 , ...)
>>> os.path.join('/','a','b','c','c/abc/def/','1.txt')
'/a/b/c/c/abc/def/1.txt'
1.2.7 获取指定文件大小
os.path.getsize(文件名)
fish@home:~$ ls -l /bin/ls
-rwxr-xr-x 1 root root 138208 Feb 8 2022 /bin/ls
查看是138208 字节
>>> os.path.getsize('/bin/ls')
138208
1.2.8 获取目录中的内容
os.listdir(path)
>>> os.listdir('/etc/default')
['apport', 'console-setup', 'cron', 'dbus', 'irqbalance', 'keyboard', 'locale', 'motd-news', 'networkd-dispatcher', 'rsync', 'ssh', 'ufw', 'useradd']
1.2.9 使用通配符获取目录中的内容
glob(path)
这个方法在glob模块
import glob
for filename in glob.glob(r"c:\windows\*.exe"):
print(filename)
1.2.10 遍历目录树
os.walk(path)
它返回三个值:
- 当前路径
- 当前路径下的目录名列表
- 当前路径下的文件名列表
之后再依次递归遍历当前路径下的目录
import os
for current_path, sub_path, filenames in os.walk(r"D:\bin\flomo"):
print("当前路径:",current_path)
print("当前路径下的目录:", sub_path)
print("当前路径下的文件:", filenames)
print("---------------")
1.3 文件操作
文件操作包括文件的读写,文件可以是二进制和文本文件。
1.3.1 打开文件
open(file, mode, ...)
参数:
- file参数是要打开的文件
- mode参数是打开模式
模式 | 说明 |
r | 只读 |
w | 写入模式,覆盖原内容 |
x | 独占模式(文件必须不存在,创建文件,写入模式) |
a | 追加模式 |
b | 二进制模式 |
t | 文本模式 |
+ | 更新模式 |
b,t是文件类型的模式,如果是二进制文件需要设置:rb,wb,xb,ab,如果是文本模式可以省略t(默认)
- bufering 设置缓冲区,默认-1,系统自动设置。
- encoding 指定文件编码,用于文本文件。
fp = open("d:\\1.txt",'r', encoding='utf-8')
print(fp.read())
1.3.2 关闭文件
文件用完需要关闭,一般放在finally中关闭:
fp = None
try:
fp = open("d:\\21.txt", 'r', encoding='utf-8')
print(fp.read())
except Exception as e:
print(e)
finally:
if fp is not None:
fp.close()
这样写很麻烦,一般用自动资源管理,这里用到with关键字
with open("d:\\1.txt", 'r', encoding='utf-8') as fp:
print(fp.read())
with代码结束会自动关闭文件。
1.3.3 文本文件的读写
函数 | 说明 |
read(n=-1) | 读取字符串,n表示读取的字符数,-1时没有限制 |
readline(limit=-1) | 读取一行,limit表示读取的字符数,-1表示没有限制 |
readlines(hint=-1) | 按行读取数据到列表中 |
write(s) | 将字符串写入文件中 |
writelines(lines) | 向文件中写入一个列表 |
flush() | 刷新缓冲区,数据写入文件 |
filename = r"d:\err.txt"
with open(filename, 'r') as fp:
content = fp.read()
print(content)
1.3.4二进制文件的读写
filename = r"d:\1.png"
with open(filename, 'rb') as fp: # 打开方式后面加b
content = fp.read()
with open("2.jpg",'wb') as to:
to.write(content)
1.4 shutil模块
1.4.1 文件复制
shutil.copy(source, destination)
import shutil
shutil.copy("2.jpg","3.jpg")
1.4.2 复制目录树
shutil.copytree(source, destination)
import shutil
shutil.copytree(r"D:\data\CNKI",r"d:\a")
1.4.3 移动
shutil.move(source, destination)
同时也具有更名的效果。
import shutil
shutil.move(r"d:\a",r"d:\b\c")
shutil.move("2.jpg","4.jpg")
1.4.4 删除目录树
shutil.rmtree(目录)
import shutil
# 删除目录C
shutil.rmtree(r"d:\b\c")
1.5 压缩文件
1.5.1 创建压缩文件
zipfile.ZipFile("out.zip",'w', zipfile.ZIP_DEFLATED)
- out.zip 表示输出文件
- zipfile.ZIP_DEFLATED 表示压缩方式
import zipfile
# 创建压缩对象
fp = zipfile.ZipFile("out.zip",'w', zipfile.ZIP_DEFLATED)
# 添加文件
fp.write("3.jpg")
fp.write("4.jpg")
fp.write("1.xlsx")
fp.close()
1.5.2 查看文件信息
zipfile.ZipFile("in.zip",'r')
- in.zip表示输入文件
import zipfile
# 读取压缩文件
info = zipfile.ZipFile("out.zip",'r')
# 查看名字信息
for filename in info.namelist():
print(filename)
# 更多信息
for item in info.infolist():
# 文件名,大小,压缩大小,日期
print(item.filename, item.file_size, item.compress_size, item.date_time)
1.5.3 解压zip文件
import zipfile
unzip = zipfile.ZipFile("out.zip")
# 解压到abc目录
unzip.extractall('abc')
unzip.close()