1. 程式人生 > 實用技巧 >一個可以選擇目錄生成doc目錄內容的小工具(一)

一個可以選擇目錄生成doc目錄內容的小工具(一)

需求
給定一個目錄,生成一個doc檔案,內容是:目錄的內容。

**目錄結構:
|--一級資料夾A
| |--壓縮包A4.rar
| |--文件A1.docx
| |--文件A2.docx
| |--文件A3.docx
|--一級資料夾B
| |--資料夾B1
| | |--文件B11 .docx
| | |--文件B12.docx
| |--文件B1.docx
| |--文件B2.docx
|--主要內容.docx
主要內容就是我們要生成的doc檔案,放在要解析的目錄就可以了。
**doc內容:

思路
我們分三部分實現這個功能:
1、首先我們做一個簡單的gui,有很多gui的庫可以選擇,這個需求功能簡單,所以選了thinker,python標準庫方便,滿足需求
2、遍歷目錄結構,選擇python標準庫os
3、將目錄內容寫到word中,選擇docx庫

Gui

怎麼說呢,thinker庫很直觀?我很少接觸gui庫,不過幾分鐘弄個demo出來還是很簡單的。

from tkinter import *
from tkinter.filedialog import askdirectory

#選擇路徑
def selectPath():
    path_ = askdirectory()
    path.set(path_)

def outPut():
    pass
    
# 建立視窗物件
root_window = Tk()
root_window.title('目錄內容識別工具')
root_window.geometry('300x100')

#文字框中顯示路徑地址
path = StringVar()

Label(root_window,text = "目標路徑:").grid(row = 0, column = 0)

#textvariable關聯一個StringVar類,可以用set()和get()函式去設定和獲取控制元件中的值
Entry(root_window, textvariable = path).grid(row = 0, column = 1)

Button(root_window, text = "選擇", command = selectPath,width=6).grid(row = 0, column = 2)
Button(root_window, text = "匯出", command=outPut ,width=6).grid(row = 0, column = 3)

#進入訊息迴圈,沒這個不顯示
root_window.mainloop()

大致是這樣的,先建立一個視窗物件TK,然後往裡邊元件
Label:目標路徑
Entry:文字框
Button:按鈕
selectPath() :路徑選擇邏輯
outPut() :匯出邏輯
askdirectory():內建函式,獲取路徑地址

結果

遍歷目錄
遍歷目錄有三種方式,os.walk() 、os.listdir()、os.scandir()
其中listdir和scandir都不對目錄遞迴遍歷,就是說不返回目錄下的子檔案下的內容,walk可以返回子檔案下的內容,但他是廣度遍歷。就是返回第一層目錄,再接著遍歷第二層,接著第三層。詳細看下一節介紹。
我這裡選擇scandir,然後自己遞迴遍歷下層資料夾(深度遍歷)。

import os
import os.path

def test_showdir(path, depth):
    for item in os.scandir(path):
        print("|     " * depth + "+--" + item.name)
        # #遞迴出口
        if item.is_dir():
            test_showdir(item.path, depth + 1)

if __name__ == '__main__':
    path = r'C:\Users\Administrator\Desktop\測試'
    test_showdir(path, 0)

這裡有兩個知識點:
1、函式的遞迴呼叫(出口if 、引數depth)
2、目錄遍歷方法的選擇

結果:

python-docx
docx簡直是神器呀,基本能實現大部分的word需求,以前寫自動巡檢報告的時候經常要用到。
這裡先貼一段官方程式碼感受一下吧

from docx import Document
from docx.shared import Inches

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
    'first item in ordered list', style='List Number'
)

document.add_picture('monty-truth.png', width=Inches(1.25))

records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

document.add_page_break()

document.save('demo.docx')

總結:
本節介紹一下需求和思路,上述的三個環節在以下章節再詳細討論。