创建、移动、复制文件和文件夹
文件路径和名称处理
……
有些指令是Windows、Mac、Linux通用的
有些只在Mac、Linux下可用
官方文档:https://docs.python.org/zh-cn/3/library/os.html
获取当前python程序运行路径:os.getcwd()
import os
print(os.getcwd())
输出结果:
K:\Python learning
关于路径中的斜杠(/)和反斜杠(\)
windows中采用反斜杠(\)作为文件夹之间的分隔符
Mac和Linux中采用斜杠(/)作为文件夹之间的分隔符
反斜杠在Python中用于转义,所以变成了两个反斜杠\\
import os
print(os.path.join(os.getcwd(),'MyProjects','AI'))
输出结果:
K:\Python learning\MyProjects\AI
绝对路径:从根文件夹开始。windows从C盘、D盘等开始 ;Mac、Linux就是/
相对路径:相对于程序当前运行目录。如:./practice 是程序运行目录下的文件名
import os
print(os.listdir())
输出结果:
['V1', '这是一个文件.txt', '这是一个文件夹']
import os
for item in os.listdir():
print(item)
输出结果:
V1
这是一个文件.txt
这是一个文件夹
import os
print(os.listdir('K:\\Python learning\\V1\\'))
#可以写两个反斜杠,也可写一个
输出结果:
['a.py']
import os
files=os.listdir('K:\\Python learning\\')
for file in files:
print(file,os.path.isdir(file))
输出结果:
V1 True
这是一个文件.txt False
这是一个文件夹 True
一个更推荐使用的方法:os.scandir(指定的绝对路径或相对路径)
import os
files=os.scandir('K:\\Python learning\\')
for file in files:
print(file.name,file.path,file.is_dir())
输出结果:
V1 K:\Python learning\V1 True
这是一个文件.txt K:\Python learning\这是一个文件.txt False
这是一个文件夹 K:\Python learning\这是一个文件夹 True
作业:
编写一个Python程序,要求
1、找出当前目录下所有非文件夹的文件;
2、统计其中包含有“Python”单词的文件数量;
3、不区分大小写;
4、输出文件数量
import os
for dirpath,dirnames,files in os.walk('./'):
print(f'发现文件夹:{dirpath}')
print(files)
#dirpath是文件夹路径
#dirnames是dirpath这个文件夹下的子文件夹列表
#files是dirpath这个文件夹里的文件列表
(1)利用字符串内置的方法:.startswith()和.endswith()
print('abc.txt'.startswith('ab')) # 字符串A.startswith(字符串B):字符串A是否以字符串B开头
print('abc.txt'.endswith('.txt')) # 字符串A.endswith(字符串B):字符串A是否以字符串B结尾
输出结果:
True
True
(2)glob模块:glob.glob()
import glob
print(glob.glob('*.txt'))
输出结果:
['这是一个文件.txt']
文件搜索匹配:
(3)fnmatch模块 --可以用来匹配文件名
import glob
print(glob.glob('**/*.py', recursive=True))
输出结果:
['lesson01.py']
import glob
# 用**表示任意层文件或文件夹,recursive=True会不断进入文件夹内
print(glob.glob('**/*.py', recursive=True))
输出结果:
['V1\\a.py']
import os
for file in os.scandir('k:/Python learning/'):
print(file,file.stat())
输出结果:
os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=1447, st_atime=1587297641, st_mtime=1577799986, st_ctime=1587297641)
os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1587297814, st_mtime=1587297814, st_ctime=1587293622)
返回值的文件信息属性:
st_mode: inode 保护模式
-File mode: file type and file mode bits (permissions).
st_ino: inode 节点号。
-Platform dependent, but if non-zero, uniquely identifies the file for a given value of st_dev.
——the inode number on Unix,
——the file index on Windows
st_dev: inode 驻留的设备。
-Identifier of the device on which this file resides.
st_nlink:inode 的链接数。
-Number of hard links.
st_uid: 所有者的用户ID。
-User identifier of the file owner.
st_gid: 所有者的组ID。
-Group identifier of the file owner.
st_size:普通文件以字节为单位的大小;包含等待某些特殊文件的数据。除以1024就是KB
-Size of the file in bytes, if it is a regular file or a symbolic link. The size of a symbolic link is the length of the pathname it contains, without a terminating null byte.
st_atime: 上次访问的时间。
-Time of most recent access expressed in seconds.
st_mtime: 最后一次修改的时间。
-Time of most recent content modification expressed in seconds.
st_ctime:由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
st_atime_ns
-Time of most recent access expressed in nanoseconds as an integer
st_mtime_ns
-Time of most recent content modification expressed in nanoseconds as an integer.
st_ctime_ns
-Platform dependent:
——the time of most recent metadata change on Unix,
——the time of creation on Windows, expressed in nanoseconds as an integer.
st_birthtime:只在Mac、Linux下可用,表示创建时间
时间都是一些大的浮点数-时间戳(每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示。)
从返回浮点数的时间辍方式向时间元组转换,只要将浮点数传递给如localtime之类的函数。
可以利用Python转换为正常日期时间
import os
import time
statinfo =os.stat(r'k:/Python learning/V1/lesson01.py')
print (statinfo)
print(time.ctime(statinfo.st_atime))
print(time.localtime(statinfo.st_atime))
输出结果:
os.stat_result(st_mode=33206, st_ino=1125899906842693, st_dev=540906, st_nlink=1, st_uid=0, st_gid=0, st_size=178, st_atime=1587299079, st_mtime=1587299079, st_ctime=1587290702)
Sun Apr 19 20:24:39 2020
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=19, tm_hour=20, tm_min=24, tm_sec=39, tm_wday=6, tm_yday=110, tm_isdst=0)
import os
import time
import datetime
statinfo =os.stat(r'k:/Python learning/V1/lesson01.py')
print (statinfo)
print(time.ctime(statinfo.st_atime))
print(datetime.datetime.fromtimestamp(statinfo.st_atime)) # datetime模块转换时间格式
print(time.localtime(statinfo.st_atime))
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(statinfo.st_atime))) # time 模块的 strftime 方法来格式化日期
输出结果:
os.stat_result(st_mode=33206, st_ino=1125899906842693, st_dev=540906, st_nlink=1, st_uid=0, st_gid=0, st_size=423, st_atime=1587300162, st_mtime=1587300162, st_ctime=1587290702)
Sun Apr 19 20:42:42 2020
2020-04-19 20:42:42.330106
time.struct_time(tm_year=2020, tm_mon=4, tm_mday=19, tm_hour=20, tm_min=42, tm_sec=42, tm_wday=6, tm_yday=110, tm_isdst=0)
2020-04-19 20:42:42
附:月份缩写 -_-||
time 模块的 strftime 方法来格式化日期
附:格式化符号
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X本地相应的时间表示
%Z 当前时区的名称
%% %号本身
作业:编写一个Python程序,要求
1、搜索整个文件夹,包括文件夹内的所有文件夹;
2、筛选体积大于100MB的压缩包zip文件
3、筛选这些文件中日期早于2019年之前的文件;
4、输出这些文件的路径
读取文件内容:open(),readlines(),close()
f = open('K:\Python learning\\file.txt','r', encoding='utf-8')
# 打开某个文件,'r'表示读取文件,encoding='utf-8'表示以utf-8编码读取
text = f.readlines()
print(text)
f.close
一种建议的写法:with ... as ...
with open('K:\Python learning\\file.txt','r', encoding='utf-8') as f:
text = f.readlines()
print(text)
输出结果:
['内容:这是一个文件']
简单理解:不管程序是否正常运行都会关闭文件,不需要再单独写close()
with open('K:\Python learning\\file.txt','r', encoding='utf-8') as f:
text = '第一行内容\n第二行内容\n'
f.write(text)
f.write('第三行内容')
# 'w'表示写入文件,若无该文件则直接创建一个,若有这个文件,则里面的内容会被清空掉
# 'a'表示写入文件,若无该文件会直接创建一个,若存在这个文件,会在原有内容后面继续写入
创建临时文件储存数据:TemporaryFile()
from tempfile import TemporaryFile # 程序运行完后会自动删掉临时文件
f = TemporaryFile('w+') # 'w+'表示写入及读取文件
f.write('Hello 梅老师!')
f.seek(0) # 表示回到文件开关位置
data = f.readlines()
print(data)
f.cose()
另一写法:
from tempfile import TemporaryFile # 程序运行完后会自动删掉临时文件
with TemporaryFile('w+') as f:
f.write('Hello 梅老师!')
f.seek(0) # 表示回到文件开关位置
data = f.readlines()
print(data)
from tempfile import TemporaryDirectory # 程序运行完后会自动删掉临时文件夹
with TemporaryDirectory('w+') as tmp_folder:
print(f'临时文件夹已创建:{tmp_folder}')
输出结果:
临时文件夹已创建:C:\Users\just_\AppData\Local\Temp\tmp51jqr1t3w+
import os
os.mkdir('新文件夹') # 当文件夹已存在时运行此代码会报错
import os
if not os.path.exists('新文件夹'):
os.mkdir('新文件夹') # 当不存在该文件夹时才创建文件夹
import os
os.makedirs('新文件夹/第一层文件夹/第二层文件夹/')
shutil.copy(要复制的文件,要复制到的位置)
两种方式:第二个参数写某个文件夹位置,则复制到该文件夹下
第二个参数 写某个文件路径,复制到这个路径并且重命名
import shutil
shutil.copy('file.txt','./新文件夹/')
shutil.copy('file.txt','./新文件夹/new_file.txt')
shutil.copytree(要复制的文件夹,要复制到的新文件夹位置)
import shutil
shutil.copytree('这是一个文件夹','这是一个新文件夹')
# 会将文件夹内的所有文件和文件夹都复制过去,注意新文件夹不能已经存在
shutil.move(要移动的文件/文件夹,要移动到的位置)
两种方式:第二个参数写某个文件夹位置,则移动到该文件夹下
第二个参数写某个文件路径,移动到这个路径并且重命名
如果是文件夹记住最后加斜杠/
import shutil
shutil.move('file.txt','新文件夹/file3.txt')
shutil.move('file.txt','新文件夹/')
shutil.move('新文件夹','这是一个新文件夹/')
import os
os.rename('file.txt','file1.txt')
import os
os.remove('file1.txt') # 只能删文件,如果是文件路径则会报错
import shutil
shutil.rmtree('这是一个文件夹')
作业:按格式批量修改文件名字并移动
编写一个Ptyhon程序 ,要求
1、找出当前目录下所有.zip文件
2、将所有文件重命名,在原本文件名的开头加上最后修改日期
3、创建一个新文件夹叫backup
4、将所有重命名后的文件都移动到backup文件夹里面
import zipfile
with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
print(zipobj.namelist())
输出结果:
['╣┼╜±╓╨═Γ└·╩╖.xls', '╦──Ω╝╢╫≈╬─.txt', '╨í╤º╙∩╬─╓¬╩╢doc.doc', '╨í╤º╙∩╬─╓¬╩╢pdf.pdf', 'dddd.txt']
import zipfile
with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
for file_name in zipobj.namelist():
info=zipobj.getinfo(file_name)
file_name=file_name.encode('cp437').decode('gbk')
#有中文时会显示乱码,需要调整编码,处理压缩包里的中文.encode('cp437').decode('gbk')
print(file_name,info.file_size,info.compress_size)
输出结果:
古今中外历史.xls 214528 86946
四年级作文.txt 1447 714
小学语文知识doc.doc 53248 16872
小学语文知识pdf.pdf 496871 478538
dddd.txt 1447 714
.file_size是原始文件大小
.compress_sie是压缩后大小
输出结果单位是字节
import zipfile
with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
for file_name in zipobj.namelist():
correct_path=file_name.encode('cp437').decode('gbk')
zipobj.extract('dddd.txt')
#有中文时会乱码,需调整编码,建议路径中文件和文件夹不要出现中文,如果有中文的可以先获取正确的编码文字,再重命名
import zipfile
with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
zipobj.extractall()
#有中文时会乱码,需调整编码,建议路径中文件和文件夹不要出现中文,如果有中文的可以先获取正确的编码文字,再重命名
import zipfile
file_list = ['lesson1.py','lesson2.py','file1.txt'] #列表中文件要存在
with zipfile.ZipFile('这是程序创建的压缩包.zip','w') as zipobj:
for file in file_list:
zipobj.write(file)
import zipfile
with zipfile.ZipFile('这是程序创建的压缩包.zip','a') as zipobj: #追加的文件要存在
zipobj.write('file2.txt')
作业:
编写一个Python程序,要求
1、找出当前目录下所有距离上次修改时间超过3个月的文件
2、将所有文件重命名,在原本文件名的开头加上最后修改日期
3、创建一个文件夹叫backup
4、将所有重命名后的文件都添加到压缩包里,给压缩包名字加上今天日期
5、将压缩包移动到backup文件夹里面
6、删掉原始文件