投稿作者:Huang supreme
编辑整理:JackTian
微信公众号:杰哥的IT之旅(ID:Jake_Internet)
投稿作者文章导读:
1、“罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
2、利用 Python 进行多 Sheet 表合并、多工作簿合并、一表按列拆分
1、输出目录下所有文件及文件夹
1)os.getcwd():获取当前python程序的运行路径
import os
os.getcwd()
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cbffe5f4df711272759595c6646b9e9e.png)
2)路径中斜杠(/)和反斜杠()的说明
![](https://i-blog.csdnimg.cn/blog_migrate/0c57f23e6a35d1af792df11d6c8409b2.png)
3)os.path.join():自动连接路径(不同的操作系统,连接符不同)
os.path.join("My Project","Demo")
"C:\\" + os.path.join("My Project","Demo")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/19d85d4dbfd8d174929d88c153368951.png)
4)绝对路径和相对路径
![](https://i-blog.csdnimg.cn/blog_migrate/11842ed2144deddaf642174430863ed6.png)
5)os.listdir()与os.isdir()
os.listdir():列出当前程序文件夹下的所有文件和文件夹;
os.scandir():os.listdir()的一种更好的替代方法,返回的是一个迭代器。注意:我们可以采用循环迭代其中的每一个元素,os.scandir()有两个特殊的属性和一个方法,我们在下面的例子中,进行演示。
os.listdir()
os.scandir()
for item in os.scandir():
print(item.name,item.is_dir(),"\n\t",item.path)
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c08be3b519ea32f1545de7faf9fd285a.png)
其实,os.listdir()或者os.scandir()其实可以传入一个路径,然后获取指定路径下的文件或者文件夹。
os.listdir("G:\\6Tipdm\\Python集训营_情感分析")
for item in os.scandir("G:\\6Tipdm\\Python集训营_情感分析"):
print(item.name,item.is_dir(),"\n")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f30d31d5b932ba7dc384bd34aad83306.png)
2、遍历、搜索文件及查询文件信息
1)找出文件夹里的文件夹里的“文件”或“文件夹”
① os.walk(路径):传入一个路径,帮助我们将文件夹里的文件夹里的文件夹里的文件都找出来。
for dirpath, dirnames, files in os.walk("./"):
print(f"发现文件夹\t{dirpath}")
print(files)
-----------------------------------------------
for dirpath, dirnames, files in os.walk("./"):
print(f"发现文件夹\t{dirpath}")
print(dirnames)
"""
dirpath是文件夹路径
dirnames是dirpath这个文件夹下的子文件夹列表
files是dirpath这个文件夹里的文件列表
"""
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/4a50dd4bbd4b6204e5321c741960b612.png)
2)搜索、匹配文件名称及文件信息查看
① 方法一:startswith()和endswith()
字符串A.startswith(字符串B):字符串A是否以字符串B开头;
字符串A.endswith(字符串B):字符串A是否以字符串B结尾;
"abc.txt".startswith("abc")
"abc.txt".endswith(".txt")
------------------------------------------------------
list1 = ["a.txt", "b.py", "c.xlsx", "d.txt", "e.txt"]
for item in list1:
if item.endswith(".txt"):
print(item)
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a5cedf0de130492eab45b3ce60638f1b.png)
② 方法二:glob模块
该模块可以采取类似于“正则”的方式,进行文件匹配,用起来很方便。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b32a4d26558d275753bb3472a6f68cd9.png)
代码如下:
for i in glob.glob("*.txt"):
print(i)
---------------------------
for i in glob.glob("a*.txt"):
print(i)
---------------------------
for i in glob.glob("a?.txt"):
print(i)
---------------------------
for i in glob.glob("a??.txt"):
print(i)
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/403dd25f98ac6e9de59d0370e89a8c98.png)
特别的:glob()方法中还有一个参数recursive = True,能够将所有深层文件夹里面,符合条件的文件给你找出来。
# 注意:一个*和两个*的区别
glob.glob("*/*.txt",recursive=True)
glob.glob("**/*.txt",recursive=True)
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e87063e4f54ee3c684550d28f991d741.png)
③ os.scandir()返回的文件都可以利用stat()方法,进行查看
![](https://i-blog.csdnimg.cn/blog_migrate/14ee4f0a0de8696433ed0970fd375af4.png)
代码如下:
for file in os.scandir():
print(file.name, file.stat(), "\n")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8bf8050d9e7b37e6faba184bf0d22a5e.png)
接着,我们获取上述几个常用属性看看。
import time
for file in os.scandir():
print(file.name, file.stat().st_size, time.ctime(file.stat().st_ctime), "\n")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/99e8c9663eb18f608408969c0eb5f121.png)
3、批量创建、复制、移动、删除、重命名文件及文件夹
1)创建文件夹
os.mkdir("新文件夹名称"):创建单层文件夹;
os.makedirs("第一层/第二层/第三层"):创建多层文件夹;
list1 = ["文件夹{}".format(i) for i in range(5)]
for i in list1:
os.mkdir(i)
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/3f66ac4f6e7972c4350144ba923ceea2.png)
问题:当某个文件夹已经存在的时候,运行此代码,会报错。此时可以添加一个判断条件
(os.path.exists("新文件夹名称"))。
if not os.path.exists("傻逼"):
os.mkdir("傻逼")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/b88ed6e9f3ac208f28f2982505cfb30e.png)
2)复制文件及文件夹(shutil模块儿)
shutil.copy("要复制的文件", "要复制到的位置"):复制文件;
shutil.copytree("要复制的文件夹", "要复制到的新文件夹的位置"):复制文件夹;
① 复制文件
shutil.copy("要复制的文件", "要复制到的位置");
操作如下:
import shutil
# 将aba.txt复制一份到project文件夹中。
shutil.copy("aba.txt", "./project")
# 将aba.txt复制一份到project文件夹中,并重新命名为“新名字.txt”。
shutil.copy("aba.txt", "./project/新名字.txt")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/051dacd6b39d10cbdad242cb16603c08.png)
② 复制文件夹:相当于重命名文件夹
shutil.copytree("要复制的文件夹", "要复制到的新文件夹的位置");
注意:将某个文件夹移动到另外一个文件夹(该文件夹必须是新文件夹),不能是已经存在了的文件夹;
操作如下:
import shutil
shutil.copytree("project", "./qq")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/d7151a28d2635f42b9fe50bcd9a63a42.png)
3)移动文件或文件夹
shutil.move("要移动的文件或文件夹","要移动到的位置"):移动文件/文件夹;
文件夹或者文件被移动后,原始文件就没有了;
① 移动文件
shutil.move("要移动的文件","要移动到的位置")
操作如下:
import shutil
# 将aba.txt移动到“傻逼”文件夹下
shutil.move("aba.txt","./傻逼/")
# # 将test.txt移动到“傻逼”文件夹下,并重新命名为test1.txt
shutil.move("test.txt","./傻逼/test1.txt")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/74c395a167019b389de2225dfa0eda4e.png)
② 移动文件夹
shutil.move("要移动的文件夹","要移动到的位置")
操作如下:
import shutil
# 将“第一层”文件夹移动到“傻逼”文件夹下
shutil.move("第一层","./傻逼/")
# 将“qq”文件夹移动到“傻逼”文件夹下,并重新命名为“哈哈”文件夹
shutil.move("qq","./傻逼/哈哈")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/d528e7ebab4ef519eddd83edb2d1c6fb.png)
4)重命名文件或文件夹
os.rename("文件/文件夹","新文件名/新文件夹名")
操作如下:
import os
# 将test1.xlsx重命名为“my.xlsx”
os.rename("test1.xlsx","my.xlsx")
# 将“傻逼”文件夹重命名为“傻子”文件夹
os.rename("傻逼","傻子")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/acd784bccbf170c0197883209616806f.png)
5)删除文件或文件夹
① 删除文件
os.remove("要删除的文件")
注意:这里说的只是删除文件,而不能是文件夹;
操作如下:
import os
# 删除“my.xlsx”文件
os.remove("my.xlsx")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/5b0f85af1d57aa54d8756d809043a339.png)
② 删除文件夹
shutil.rmtree("要删除的文件夹")
操作如下:
import shutil
# 删除“文件夹0”这个文件夹
shutil.rmtree("文件夹0")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/999a754161e4b6fcd792285b5ff07da4.png)
4、创建和解压压缩包
注意:这里所说的压缩包,指的是“.zip”格式的压缩包;
1)读取压缩包里的文件
import zipfile
with zipfile.ZipFile("python办公自动化.zip", "r") as zipobj:
print(zipobj.namelist())
-----------------------------------------------------------
# 注意:有时候需要写成filename.encode("cp437").decode("gbk")
with zipfile.ZipFile("python办公自动化.zip", "r") as zipobj:
for filename in zipobj.namelist():
print(filename.encode("gbk").decode("gbk"))
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/05304681b900423200a4e778455588fe.png)
2)读取压缩包里面的文件信息
import zipfile
with zipfile.ZipFile(r"G:\tableau书籍\Tableau文件.zip", "r") as zipobj:
for filename in zipobj.namelist():
info = zipobj.getinfo(filename)
new_filename = filename.encode("cp437").decode("gbk")
print(new_filename, info.file_size/1024/1024, info.compress_size/1024/1024)
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7a26950bed148d3b86b02521141f0ade.png)
3)解压压缩包
extract("压缩包内要解压的文件名","解压到哪个位置"):将压缩包内单个文件解压出来;
extractall("解压到哪个位置"):将压缩包内所有文件解压出来;
① 解压单个文件
extract("压缩包内要解压的文件名","解压到哪个位置")
import zipfile
# 将该压缩包中的“a.txt”文件,单独解压到“傻子”文件夹下
with zipfile.ZipFile(r"G:\6Tipdm\7python办公自动化\python办公自动化.zip", "r") as zipobj:
zipobj.extract("a.txt","./傻子/")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c24536c4471e89db0d6a4f5aeed1ec11.png)
② 解压整个文件
extractall("解压到哪个位置")
import zipfile
# 将该压缩包整个解压到“文件夹1”文件夹下
with zipfile.ZipFile(r"G:\6Tipdm\7python办公自动化\python办公自动化.zip", "r") as zipobj:
zipobj.extractall("./文件夹1/")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/69e2c8e708bc7be9bf47b3f8b7dc000f.png)
注意:如果你的压缩包中“有密码”,则采用以下方式进行解压。
![](https://i-blog.csdnimg.cn/blog_migrate/6bb8d21e46584374316a11f7c7fd40f8.png)
4)创建压缩包
① 对某些文件,创建压缩包
file_list = ["a.txt", "aa.txt", "文件夹1"]
# 将上述三个文件,进行打包,使用“w”
with zipfile.ZipFile(r"我创建的压缩包.zip", "w") as zipobj:
for file in file_list:
zipobj.write(file)
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a37019efe6913470e7c701a1c24446ed.png)
② 压缩包已经存在,往其中添加文件
# 往上述压缩包中,再次添加一个新文件“傻子”文件夹,使用“a”
with zipfile.ZipFile(r"我创建的压缩包.zip", "a") as zipobj:
for file in file_list:
zipobj.write("傻子")
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/de8be15443a57a7f6488ba5c2f98a5d9.png)