Python自动化办公入门(学习笔记)——文件、文件夹操作

一、os模块简介

1、os模块是python操作系统接口模块

  • python标准库
  • 和操作系统有关的操作,如:

创建、移动、复制文件和文件夹

文件路径和名称处理

……

  • 注意

有些指令是Windows、Mac、Linux通用的

有些只在Mac、Linux下可用

官方文档:https://docs.python.org/zh-cn/3/library/os.html

 

2、输出目录下所有文件及文件夹

获取当前python程序运行路径:os.getcwd()

import os
print(os.getcwd())

输出结果:

K:\Python learning

关于路径中的斜杠(/)和反斜杠(\)

windows中采用反斜杠(\)作为文件夹之间的分隔符

Mac和Linux中采用斜杠(/)作为文件夹之间的分隔符

反斜杠在Python中用于转义,所以变成了两个反斜杠\\

 

3、让Python自动处理路径连接:os.path.join(第一个,第二个,第三个,......)

import os
print(os.path.join(os.getcwd(),'MyProjects','AI'))

输出结果:

K:\Python learning\MyProjects\AI

 

4、绝对路径和相对路径

绝对路径:从根文件夹开始。windows从C盘、D盘等开始 ;Mac、Linux就是/

相对路径:相对于程序当前运行目录。如:./practice 是程序运行目录下的文件名

 

5、列出当前程序文件夹下的所有文件和文件夹:os.listdir()

import os
print(os.listdir())

输出结果:

['V1', '这是一个文件.txt', '这是一个文件夹']

import os
for item in os.listdir():
    print(item)

输出结果:

V1
这是一个文件.txt
这是一个文件夹

 

6、列出指定某个文件夹下的所有文件和文件夹:os.listdir(指定的绝对路径或相对路径 )

import os
print(os.listdir('K:\\Python learning\\V1\\')) 
#可以写两个反斜杠,也可写一个

输出结果:

['a.py']

 

7、循环一遍看谁是文件谁是文件夹:os.path.isdir(要判断的文件或文件夹路径)

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、输出文件数量

 

 

二、遍历、搜索文件及查询文件信息

1、把文件夹里的文件夹里的文件都找出来:os.walk(指定的绝对路径或相对路径)

import os

for dirpath,dirnames,files in os.walk('./'):
    print(f'发现文件夹:{dirpath}')
    print(files)
#dirpath是文件夹路径
#dirnames是dirpath这个文件夹下的子文件夹列表
#files是dirpath这个文件夹里的文件列表

 

2、搜索、匹配文件名称

(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']

文件搜索匹配:

  • * 匹配所有
  • ? 匹配任何单个字符
  • [seq] 匹配seq中的任何字符
  • [!seq] 匹配任何不在seq中的字符

 

(3)fnmatch模块 --可以用来匹配文件名

import glob
print(glob.glob('**/*.py', recursive=True))

输出结果:

['lesson01.py']

3、把藏在文件夹很多层下面的文件都找出来:print(glob.glob('**/*.py', recursive=True))

import glob

# 用**表示任意层文件或文件夹,recursive=True会不断进入文件夹内
print(glob.glob('**/*.py', recursive=True))

输出结果:

['V1\\a.py']

 

4、查询文件信息:os.scandir()返回的文件都可以查询信息

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)

5、os.stat(path) :用于在给定的路径上执行一个系统 stat 的调用。

返回值的文件信息属性:

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下可用,表示创建时间

 

 

6、unix时间戳

时间都是一些大的浮点数-时间戳(每个时间戳都以自从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)

 

7、单独查询指定文件:os.stat(指定文件路径)

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、输出这些文件的路径

 

 

 

三、创建临时文件及文件夹

1、写入和读取文件

读取文件内容: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()

 

2、写入文件内容 :open(),write()

with open('K:\Python learning\\file.txt','r', encoding='utf-8')  as f:
    text = '第一行内容\n第二行内容\n'
    f.write(text)
    f.write('第三行内容')

# 'w'表示写入文件,若无该文件则直接创建一个,若有这个文件,则里面的内容会被清空掉
# 'a'表示写入文件,若无该文件会直接创建一个,若存在这个文件,会在原有内容后面继续写入

 

3、创建临时文件及文件夹

创建临时文件储存数据: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)

 

4、创建临时文件夹:TemporaryDire()

from tempfile import TemporaryDirectory  # 程序运行完后会自动删掉临时文件夹

with TemporaryDirectory('w+') as tmp_folder:
    print(f'临时文件夹已创建:{tmp_folder}')

输出结果:

临时文件夹已创建:C:\Users\just_\AppData\Local\Temp\tmp51jqr1t3w+

 

四、批量创建、复制、移动、删除、重命名文件及文件夹

1、创建文件夹:os.mkdir(新文件夹名称)

import os

os.mkdir('新文件夹') # 当文件夹已存在时运行此代码会报错

2、检测该文件夹是否存在:os.path.exists(文件夹名称)

import os

if not os.path.exists('新文件夹'):
    os.mkdir('新文件夹') # 当不存在该文件夹时才创建文件夹

3、创建多层文件夹:os.makedirs(新文件夹名称)

import os

os.makedirs('新文件夹/第一层文件夹/第二层文件夹/') 

4、复制文件:shutil模块

shutil.copy(要复制的文件,要复制到的位置)

两种方式:第二个参数写某个文件夹位置,则复制到该文件夹下

第二个参数 写某个文件路径,复制到这个路径并且重命名

import shutil

shutil.copy('file.txt','./新文件夹/')   
shutil.copy('file.txt','./新文件夹/new_file.txt')

5、复制文件夹:shutil模块

shutil.copytree(要复制的文件夹,要复制到的新文件夹位置)

import shutil
shutil.copytree('这是一个文件夹','这是一个新文件夹')   
# 会将文件夹内的所有文件和文件夹都复制过去,注意新文件夹不能已经存在

6、移动文件或文件夹

shutil.move(要移动的文件/文件夹,要移动到的位置)

两种方式:第二个参数写某个文件夹位置,则移动到该文件夹下

                  第二个参数写某个文件路径,移动到这个路径并且重命名

如果是文件夹记住最后加斜杠/

import shutil

shutil.move('file.txt','新文件夹/file3.txt')   
shutil.move('file.txt','新文件夹/')
shutil.move('新文件夹','这是一个新文件夹/')

7、重命名文件或文件夹:os.rename(要重命名的文件/文件夹,新的名字)

import os
os.rename('file.txt','file1.txt')

8、删除文件:os.remove(要删除的文件)

import os
os.remove('file1.txt')   # 只能删文件,如果是文件路径则会报错

9、删除文件夹:shutil.retree(要删除的文件夹)

import shutil
shutil.rmtree('这是一个文件夹') 

作业:按格式批量修改文件名字并移动

编写一个Ptyhon程序 ,要求

1、找出当前目录下所有.zip文件

2、将所有文件重命名,在原本文件名的开头加上最后修改日期

3、创建一个新文件夹叫backup

4、将所有重命名后的文件都移动到backup文件夹里面

 

五、创建和解压压缩包

1、读取压缩包内文件:zipfile.ZipFile(),.namelist()

import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    print(zipobj.namelist())

输出结果:

['╣┼╜±╓╨═Γ└·╩╖.xls', '╦──Ω╝╢╫≈╬─.txt', '╨í╤º╙∩╬─╓¬╩╢doc.doc', '╨í╤º╙∩╬─╓¬╩╢pdf.pdf', 'dddd.txt']

 

2、读取压缩包内文件信息:zipobj.getinfo()

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是压缩后大小

输出结果单位是字节

3、将压缩包内单个文件解压出来:zipobj.extract(压缩包内要解压的文件名,解压到哪个位置)

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') 
        #有中文时会乱码,需调整编码,建议路径中文件和文件夹不要出现中文,如果有中文的可以先获取正确的编码文字,再重命名

4、将所有文件都提取出来:.extractall(path=解压到哪个位置)

import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    zipobj.extractall() 
    #有中文时会乱码,需调整编码,建议路径中文件和文件夹不要出现中文,如果有中文的可以先获取正确的编码文字,再重命名

5、创建压缩包:zipobj.write(待压缩文件名)

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)

6、向已有的压缩包内添加文件:zipobj.write(待添加的文件名)

import zipfile

with zipfile.ZipFile('这是程序创建的压缩包.zip','a') as zipobj:  #追加的文件要存在
    zipobj.write('file2.txt')

作业:

编写一个Python程序,要求

1、找出当前目录下所有距离上次修改时间超过3个月的文件

2、将所有文件重命名,在原本文件名的开头加上最后修改日期

3、创建一个文件夹叫backup

4、将所有重命名后的文件都添加到压缩包里,给压缩包名字加上今天日期

5、将压缩包移动到backup文件夹里面

6、删掉原始文件

 

 

你可能感兴趣的:(Python)