python统计目录和目录下的文件,并写入excel表
运营那边提出需求,有些媒体文件需要统计下
目录结构大概是这样的

每个目录下面都有很多文件,目录下面没子目录


我这里是模拟下创建的目录和文件,和运营那边说的目录结构都是一致的
想最终统计结果如下格式

我的思路如下。
这里肯定用到了操作excel的模块以及遍历目录的模块
搜索相关遍历目录的有os.walk不错
先练习下它
从结构上来看,for root, dirs, files in os.walk(...),很容易让人认为os.walk(...)生成了一个迭代器。迭代器的next方法可能会返回下一层次的文件夹内容。事实上,os.walk()是一个生成器函数。
关于生成器转自下面
https://www.zhihu.com/question/20829330
从结构上来看,for root, dirs, files in os.walk(...),很容易让人认为os.walk(...)生成了一个迭代器。迭代器的next方法可能会返回下一层次的文件夹内容。
事实上,os.walk()是一个生成器函数。生成器与迭代器,是Python引入的几大特性之一,而生成器要比迭代器高级一些。至于生成器的工作原理和适用场合,可以先从os.walk()的源码说起。
>>> def func(n):
... yield n*2
...
>>> func
<function func at 0x00000000029F6EB8>
>>> g = func(5)
>>> g
<generator object func at 0x0000000002908630>
>>>
func 就是一个生成器函数,调用该函数时返回对象就是生成器 g ,这个生成器对象的行为和迭代器是非常相似的,可以用在 for 循环等场景中。注意 yield 对应的值在函数被调用时不会立刻返回,而是调用next方法时(本质上 for 循环也是调用 next 方法)才返回
>>> g = func(5)
>>> next(g)
10 >>> g = func(5)
>>> for i in g:
... print(i)
...
10
那为什么要用生成器呢?显然,用生成器在逼格上要比迭代器高几个等级,它没有那么多冗长代码了,而且性能上一样的高效,为什么不用呢?来看看用生成器实现斐波那契数列有多简单。
def fib(n):
prev, curr = 0, 1
while n > 0:
n -= 1
yield curr
prev, curr = curr, curr + prev print([i for i in fib(10)])
#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
生成器表达式
器表达式与列表推导式长的非常像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。
>>> g = (x*2 for x in range(10))
>>> type(g)
<type 'generator'>
>>> l = [x*2 for x in range(10)]
>>> type(l)
<type 'list'>
所以os.walk是生成器函数,可以使用for迭代它
也可以使用next单次获取结果
# -*- coding:utf-8 -*-
import os dir1='D:\Pywork\总目录'
list1=[]
inter=os.walk(dir1,topdown=True)
print(inter)
print(next((inter)))
print(next((inter)))
print(next((inter)))
结果如下

每次执行结果都是一个三元组,第一个是被遍历的目录,第二个是此目录下的子目录列表,第三个此目录下的子文件列表
excel表里,我需要的就是这个列表里的子目录名,以及子目录的文件名
# -*- coding:utf-8 -*-
import os dir1='D:\Pywork\总目录'
list1=[]
for par,dirs1,files1 in os.walk(dir1,topdown=True):
print(par,'---------',dirs1,'++++++++',files1)
list1.append(dirs1)
print('list1---------------------------')
print(list1[0])
for zi in list1[0]:
print(dir1+'\\'+zi)
运行结果如下

获取子目录以及子目录的文件,打印下
这里先把excel的注释了
# -*- coding:utf-8 -*- import os
import xlwt
#写个配置文件,通过它获取目录
def get_dir():
try:
with open(r'D:\Pywork\mulu.txt', 'r') as f :
print(f.readline())
return f.readline()
except Exception as e:
print("文件格式有误,或者文件名不对----"+e)
# 创建 xls 文件对象
wb = xlwt.Workbook()
# 新增一个表单
sh = wb.add_sheet('文件信息')
# 按位置添加数据
dir_col=0
file_col=1
row_init=0
#从配置获取目录名
dir=get_dir()
for parent1, dir_names1, file_names1 in os.walk(dir):
for dir_name1 in dir_names1:
for parent2,dir_names2,file_names2 in os.walk(dir+dir_name1):
for file_name2 in file_names2:
# sh.write(row_init,dir_col,dir_name1)
# sh.write(row_init,file_col,file_name2)
# row_init=row_init+1
print(dir_name1,file_name2)
# wb.save("文件信息结果.xls")
# print(dir_name1,file_name2)
上面是通过配置文件方式获取要被操作的目标目录

写入excel运行测试成功
# -*- coding:utf-8 -*-
import os
import xlwt
#写个配置文件,通过它获取目录
def get_dir():
try:
with open(r'D:\Pywork\mulu.txt', 'r') as f :
print(f.readline())
return f.readline()
except Exception as e:
print("文件格式有误,或者文件名不对----"+e)
# 创建 xls 文件对象
wb = xlwt.Workbook()
# 新增一个表单
sh = wb.add_sheet('文件信息')
# 按位置添加数据
dir_col=0
file_col=1
row_init=0
#从配置获取目录名
dir=get_dir()
for parent1, dir_names1, file_names1 in os.walk(dir):
for dir_name1 in dir_names1:
for parent2,dir_names2,file_names2 in os.walk(dir+dir_name1):
for file_name2 in file_names2:
sh.write(row_init,dir_col,dir_name1)
sh.write(row_init,file_col,file_name2)
row_init=row_init+1
# print(dir_name1,file_name2)
wb.save("文件信息结果.xls")

改良下代码,因为我想把这个py脚本打成exe程序,交给运营。不然每次需要我帮他们弄,太麻烦我了
# -*- coding:utf-8 -*- #exe直接丢入父级目录下
import os
import xlwt #定义个获取目录的函数。没用到
def get_dir():
return os.getcwd()
# 创建 xls 文件对象
wb = xlwt.Workbook()
# 新增一个表单
sh = wb.add_sheet('子目录文件信息')
# 按位置添加数据,col表示列的意思
dir_col=0
file_col=1
row_init=0
#从配置获取目录名,这里并没用到。因为程序就在目标目录下。可以重新赋值为.
dir=get_dir()
dir="."
for parent1, dir_names1, file_names1 in os.walk(dir):
for dir_name1 in dir_names1:
for parent2,dir_names2,file_names2 in os.walk(dir+'\\'+dir_name1):
for file_name2 in file_names2:
sh.write(row_init,dir_col,dir_name1)
sh.write(row_init,file_col,file_name2)
row_init=row_init+1
wb.save("子目录文件统计.xls")
把此py脚本打成exe文件
需要用到PyInstaller以及pywin32
下载的pywin32和PyInstaller为
pywin32-221.win32-py3.5.exe
PyInstaller-3.1.1.tar.gz
Python是没有自带访问windows系统API的库的,需要下载。库的名称叫pywin32,可以从网上直接下载。
以下链接地址可以下载:http://sourceforge.net/projects/pywin32/files%2Fpywin32/ (下载适合你的Python版本)
它会自动检测你的python解释器路径并进行安装(前提是环境变量配置好了)
以下是安装过程,不用设置环境变量,它会自动检测你python的环境变量
然后自动安装到第三方插件里


关于PyInstaller-3.1.1.tar.gz的安装
我放在下面路径下了。没特殊要求

解压并安装
我的win10安装如下
D:\Programs\Python\PyInstaller-3.1.1>python setup.py install

执行
PyInstaller -F 子目录文件统计.py
-F执行py文件路径
最好exe程序在下面路径
注意下面的执行路径
D:\Programs\Python\PyInstaller-3.1.1\dist\子目录文件统计.exe
D:\Programs\Python\PyInstaller-3.1.1>PyInstaller -F 子目录文件统计.py
77 INFO: PyInstaller: 3.1.1
123 INFO: Python: 3.5.2
125 INFO: Platform: Windows-10-10.0.16299-SP0
128 INFO: wrote D:\Programs\Python\PyInstaller-3.1.1\子目录文件统计.spec
135 INFO: UPX is not available.
137 INFO: Extending PYTHONPATH with paths
['D:\\Programs\\Python\\PyInstaller-3.1.1',
'D:\\Programs\\Python\\PyInstaller-3.1.1']
144 INFO: checking Analysis
156 INFO: Building because D:\Programs\Python\PyInstaller-3.1.1\子目录文件统计.py changed
158 INFO: Initializing module dependency graph...
161 INFO: Initializing module graph hooks...
172 INFO: Analyzing base_library.zip ...
2429 INFO: running Analysis out00-Analysis.toc
2596 WARNING: lib not found: api-ms-win-crt-process-l1-1-0.dll dependency of D:\Programs\Python\Python35-32\python35.dll 2692 WARNING: lib not found: api-ms-win-crt-conio-l1-1-0.dll dependency of D:\Programs\Python\Python35-32\python35.dll
3031 INFO: Analyzing D:\Programs\Python\PyInstaller-3.1.1\子目录文件统计.py
3380 INFO: Looking for import hooks ...
3384 INFO: Processing hook hook-encodings.py
3394 INFO: Processing hook hook-pydoc.py
3395 INFO: Processing hook hook-xml.py
3581 INFO: Looking for ctypes DLLs
3587 INFO: Analyzing run-time hooks ...
3599 INFO: Looking for dynamic libraries
3687 WARNING: lib not found: api-ms-win-crt-conio-l1-1-0.dll dependency of D:\Programs\Python\Python35-32\DLLs\_ssl.pyd
3827 WARNING: lib not found: api-ms-win-crt-conio-l1-1-0.dll dependency of D:\Programs\Python\Python35-32\DLLs\_hashlib.
pyd
3863 INFO: Looking for eggs
3863 INFO: Using Python library D:\Programs\Python\Python35-32\python35.dll
3863 INFO: Found binding redirects:
[]
3881 INFO: Warnings written to D:\Programs\Python\PyInstaller-3.1.1\build\子目录文件统计\warn子目录文件统计.txt
3892 INFO: checking PYZ
3894 INFO: Building because toc changed
3895 INFO: Building PYZ (ZlibArchive) D:\Programs\Python\PyInstaller-3.1.1\build\子目录文件统计\out00-PYZ.pyz
4178 INFO: checking PKG
4180 INFO: Building because toc changed
4180 INFO: Building PKG (CArchive) out00-PKG.pkg
5477 INFO: Bootloader D:\Programs\Python\Python35-32\lib\site-packages\pyinstaller-3.1.1-py3.5.egg\PyInstaller\bootloade
r\Windows-32bit\run.exe
5478 INFO: checking EXE
5479 INFO: Building because out00-EXE.toc is bad
5490 INFO: Building EXE from out00-EXE.toc
5495 INFO: Appending archive to EXE D:\Programs\Python\PyInstaller-3.1.1\dist\子目录文件统计.exe D:\Programs\Python\PyInstaller-3.1.1>
注意!!!存储py文件的时候必须是如下格式
否则打包成exe的时候,会无法成功

把exe程序拿出来

复制放到这里

退出杀毒软件,双击运行
生成xls文件

双击打开

python统计目录和目录下的文件,并写入excel表的更多相关文章
- python递归列出目录及其子目录下所有文件
python递归列出目录及其子目录下所有文件 一.前言 函数的递归,简单来说,就是函数内部调用自己 先举个小例子,求阶乘 def factorial(n): if n == 0: return 1 e ...
- 读取xml文件,写入excel
在上一篇 Python写xml文件已经将所有订单写入xml文件,这一篇我们把xml文件中的内容读出来,写入excel文件. 输入xml格式: <?xml version="1.0&qu ...
- python查找目录及子目录下特定文件
写这篇博客的缘由: 面试归来翻脉脉发现一个陌生的朋友提出一个面试题,设计实现遍历目录及子目录,抓取.pyc文件. 并贴出两种实现方法: 个人感觉,这两种方法中规中矩,不像是python的风格.pyth ...
- Python——用os模块寻找指定目录(包括子目录)下所有图片文件
import os # 导入os模块 def search_file(start_dir): img_list = [] extend_name = ['.jpg', '.png', '.gif'] ...
- 复制目录及其子目录下所有文件DOC
echo 开始同步代码 set src_home=F:\work\sign\Bonade-Sign set dest_home=F:\work\testGit\sign5\Bonade-Sign se ...
- [python] 统计某一路径下所有代码真实行数(空行已被过滤)
#-*- coding:utf-8 -*- ''' Created on 2018年8月15日 @author: anyd ''' import os list_line = [] filepat ...
- python使用xlrd, xlwt读取excel文件和 写入excel文件
python 3.6 首先在cmd下执行安装指令 xlre和xlwt : pip install xlre pip install xlwt #-*- coding: utf8 -*-im ...
- python模块:xlsxwriter和xlrd相结合读取、写入excel文件
python模块简单说明: xlsxwriter:负责写入数据 xlrd:负责读取数据 xlsxwriter 官方文档:http://xlsxwriter.readthedocs.org 本实例是刚写 ...
- python学习笔记6-输入输出与文件读取写入
(1)打印到屏幕:print (2)读取键盘输入:input/raw_input #键盘输入 str = raw_input("Please enter:"); print (&q ...
随机推荐
- Python字典的一点用法
#python的基本语法网上已经有很多详细的解释了,写在这里方便自己记忆一些 字典是一种映射类型的数据结构,(映射一般是数学中的术语,指两个元素之间元素相互对应的关系).字典和序列有很大的不同,序列类 ...
- 踩坑学习python自动化测试第一天!
这只是一个标题, # 迭代器与生成器# 迭代器有两个基本的方法:iter() 和 next(). # 字符串,列表或元组对象都可用于创建迭代器:"""list1 = [1 ...
- k8s的flannel的pod运行一段时间init error
问题现象 使用Kubeadm部署的flannel网络运行一段时间后,提示init:Error错误,查看具体的信息如下: [root@node1 ~]# kubectl describe pod kub ...
- python文件(概念、基本操作、常用操作、文本文件的编码方式)
文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...
- java往MongDB导入大量数据
好几月没写博客了~~~ --------------------- 在公司最近在搞用java往MongDB导入数据 现在是我刚导入2000W条数据了 所以就先写上吧,废话也不多说了 MongDB 我本 ...
- callback回调函数的理解
callback采用的设计模式是:模板模式,他的设计理念是基于面向对象中的多态的. 我们的程序中走到某个地方他会出现不一样的动作的时候,我们在这儿就使用回调函数.我们利用的就是 多态的原理,我们传递不 ...
- Javascript学习--BOM操作
1 获取UA(user Agent)用户代理 <!DOCtype html> <html> <head> <title></title> & ...
- ES6 let&const
今天来总结一下ES6里面let与const的用法 先总体看一下ES6中的let都有哪些特性: let 特性 let声明的变量在js中不可以重复声明,防止变量的污染和覆盖 let声明的变量不涉及变量的提 ...
- JavaScript·DOM,BOM
YI.DOM 1.创建DOM 2.删除DOM 3.文档碎片 文档碎片可以提高DOM操作性能(理论上) 文档碎片(类似于一个口袋,先将多个元素放在口袋里,放完之后,再将口袋放到最终要插入的元素中): d ...
- 博客 新址: https://pheromone.github.io/
该博客暂时调整歇业,小店地址暂时搬迁至: https://pheromone.github.io/ 该博客只做旧文章的维护工作. 博客 新址: https://pheromone.github.io ...