運營那邊提出需求,有些媒體文件須要統計下python
目錄結構大概是這樣的windows
每一個目錄下面都有不少文件,目錄下面沒子目錄api
我這裏是模擬下建立的目錄和文件,和運營那邊說的目錄結構都是一致的bash
想最終統計結果以下格式app
個人思路以下。函數
這裏確定用到了操做excel的模塊以及遍歷目錄的模塊性能
搜索相關遍歷目錄的有os.walk不錯測試
先練習下它ui
從結構上來看,for root, dirs, files in os.walk(...),很容易讓人認爲os.walk(...)生成了一個迭代器。迭代器的next方法可能會返回下一層次的文件夾內容。事實上,os.walk()是一個生成器函數。spa
關於生成器轉自下面
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文件
雙擊打開