文件管理
Python的目录分隔符:/ 或者 \\
Python使用os模块进行文件管理
创建和删除目录
创建目录
os.mkdir(path)
创建目录前
import os
os.mkdir('期末')
这里使用的是相对路径,直接在本级目录下创建了新目录
如果目录已存在会报错
import os
os.mkdir('./e')#等同于os.mkdir('e'),./表示本级目录
删除目录
os.rmdir(path)
如果目录非空会报错
import os
os.rmdir('../f')#../表示上级目录,这里表示的是c的路径
删除文件和重命名
删除文件
os.remove(path)
只能删除文件,删除目录会报错
import os
os.remove('../g')
而删除f文件夹下的f.txt就能成
import os
os.remove('../f/f.txt')
重命名(实际上也可以用于移动)
os.rename(src,dst)
就是将原来文件的文件路径改为目的文件路径,如果修改目录部分会修改文件的位置,如果只修改文件名就相当于重命名
import os
os.rename('../f', '../g/h')
移动f文件家的位置并改名为h
列举当前目录下文件和遍历文件目录
列举当前目录下文件
os.listdir(path),会返回一个函数返回指定路径下的文件和目录列表,是一个包含文件和目录名的字符串列表
import os
print(os.listdir('./'))
遍历目录下所有子目录
os.walk(top): 遍历top所有子目录,自顶向下,返回一个三元组
import os
for root, dirs, files in os.walk('../../../'):
print(f'当前目录:{root}')
print(f'子目录列表:{dirs}')
print(f'文件列表:{files}')
print('-----------------------------')
当前目录和上一级目录
之前我们提到,当前目录可以用相对路径'.'表示,上一级目录可以用'..'表示,再往上就递归地加'../'
除此之外,当前目录还可以用os.curdir,上一级目录还可以用os.pardir表示
import os
print(os.curdir)
print(os.pardir)
当然结果一样
文件路径和文件信息管理
os.path.abspath(path): 返回path绝对路径
os.path.basename(path): 返回path的文件名部分
os.path.dirname(path): 返回path中的目录部分
os.path.exists(path):判断path是否存在
os.path.isfile(path): 判断path是否是文件
os.path.isdir(path): 判断path是否是目录
import os
p='./文件.py'
p2='文件.py'
print(os.path.abspath(p))
print(os.path.basename(r'H:\AI\期末复习\a\b\c\d\文件.py'))
print(os.path.dirname(p))
print(os.path.dirname(p2))
print(os.path.dirname(r'H:\AI\期末复习\a\b\c\d\文件.py'))
在这里,使用了原始字符串(raw string)来处理路径(在字符串前加r),这样可以防止反斜杠 \
被解释为转义字符
注意最后三个dirname的区别
os.path.getatime(path): 返回文件最后访问时间戳(Access Time)
os.path.getmtime(path): 返回文件最后修改时间戳
os.path.getctime(path): 返回文件创建时间戳
os.path.getsize(path): 返回文件大小,以字节为单位
import os
from datetime import date,datetime
p='./a.txt'
print(os.path.getatime(p))
print(f'最后访问时间: {datetime.fromtimestamp(os.path.getatime(p))}')
print(f'最后修改时间: {datetime.fromtimestamp(os.path.getmtime(p))}')
print(f'创建时间: {datetime.fromtimestamp(os.path.getctime(p))}')
可以通过 datetime.fromtimestamp转化,如果只是需要日期的话可以用date.fromtimestamp,
分别返回的是一个datetime和date对象
如果要转化为字符串可以用 datetime.strftime(变量名,'%Y-%m-%d %H:%M:%S'),而从字符串转回来用datetime.strptime(变量名,'%Y-%m-%d %H:%M:%S')格式可以自己设置
看看掌握程度
#输入一个文件夹和一个时间,找出这个文件夹下(包括子目录)的文件,其最后修改日期大于输入时间,并输出这些文件路径和最后修改时间。
import os
from datetime import datetime
path,date1=input('请输入文件路径和日期,用,分隔日期格式参照:YYYY-MM-DD').split(',')
date=datetime.strptime(date1,'%Y-%m-%d')
def a(path,date):
for each in os.listdir(path):
new_path =os.path.join(path,each)
if os.path.isdir(new_path):
a(new_path,date)
else:
temp=datetime.fromtimestamp(os.path.getmtime(new_path))
if temp > date:
print(f'{new_path}, {datetime.strftime(temp,"%Y-%m-%d")}')
a(path,date)
当然也可以返回绝对路径
这里提到的os.path.join()是 Python 中用于连接路径的函数,它会根据操作系统的规范构建路径字符串。这个函数接受一个或多个路径组件作为参数,并返回连接后的路径。
文件处理
open函数
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
其中mode模式里面,默认为'r':只读模式
'w':写入模式,会覆盖掉已经存在的文件
'x‘创建模式,当文件不存在创建并以写入模式打开,如果文件已经存在会抛出异常FileExistsError
'a'追加模式,文件存在则写入内容追加到文件末尾
'b'二进制模式
't'文本模式,默认
'+'更新模式,
其中r+和w+的区别:
-
r+
模式:- 如果文件不存在,会抛出
FileNotFoundError
。 - 如果文件存在,文件指针会放在文件的开头,可以完整读取原有内容,写入的内容会覆盖原有内容,如果要追加内容,需要使用
a+
模式。
- 如果文件不存在,会抛出
-
w+
模式:- 如果文件不存在,会创建新文件。
- 如果文件存在,会清空原有内容,文件指针放在文件的开头,文件内容已经被删除,不能读取旧内容,可以写入新内容。
- 如果要追加内容,也可以使用
a+
模式
read(size=-1):读取size个字符,-1表示不限,下同
readline(size=-1):读取单行里面size个大小的字符
readlines(hint=-1):读取每一行到一个列表中,hint表示行数
write(s):将s写入到文件中
writelines(lines):向文件写入一个列表,不添加分隔符
flush():刷新缓存区,写入到文件中
# 写入文件
with open('example.txt', 'w', encoding='utf-8') as file:
file.write('Hello, World!\n')
file.write('This is a second line.\n')
# 读取文件
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print("读取整个文件内容:")
print(content)
# 读取文件的每一行
with open('example.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
print("\n读取每一行内容:")
for line in lines:
print(line,end='')
# 追加内容到文件
with open('example.txt', 'a', encoding='utf-8') as file:
file.write('This line is appended.')
# 再次读取文件
with open('example.txt', 'r', encoding='utf-8') as file:
content_after_append = file.read()
print("\n追加内容后的文件内容:")
print(content_after_append)
with open('example.txt','x') as file:
pass
举个readline的例子
temp="""Hello, World!
This is a second line.
This line is appended."""
with open('example.txt','r') as file:
content=file.read()
print(content)
with open('example.txt','r') as file:
print()
content=file.readline(4)
print(content)
再举个readLines和writeLines的例子
temp="""Hello, World!
This is a second line.
This line is appended."""
with open('example.txt','r') as file:
Lines=file.readlines()
with open('copy.txt','x') as f:
f.writelines(Lines)
再举个w+和r+的例子
temp="""Hello, World!
This is a second line.
This line is appended."""
with open('example.txt','r+') as file:
content=file.read()
print(content)
with open('example.txt','w+') as file:
print("w+的内容")
content=file.read()
print(content)
file.write(temp)
print(content)