一个可以选择目录生成doc目录内容的小工具(一)-tkinter
一、需求
给定一个目录,生成一个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\')
总结:
本节介绍一下需求和思路,上述的三个环节在以下章节再详细讨论。