文章目录

  • 一、需求
  • 二、代码说明,写在前面:
  • 三 代码主体部分。
  • 3.1 文件信息提取.py
  • 3.2 格式调整.py


一、需求

提取docx、xlsx、pptx、pdf文件信息,然后做格式处理,同时设置文件路径的超链接,已方便找文件时可以直接打开文件,其他格式文件未做。

二、代码说明,写在前面:

2.1 代码获取的信息包括:
文件路径、作者、创建日期、修改日期、各文件层级

2.2 代码 ‘文件信息提取.py’可以提取文件的信息,未获取的信息留空;

2.3 信息只运行一次,如果多次运行,出现重复数据,后续的格式调整代码会报错。

2.4 代码 ‘格式调整.py’是处理所获得的文件信息,会创建一个中间文件‘处理的中间数据_可删除.xlsx’;

2.5 代码中使用到xlwings模块,用来处理自适应列宽,其实超链接部分也可以使用这模块,但是目前没有详细了解,这里还是先使用openpyxl模块。

2.6 xlsx 由于本身python第三方包未带这类型属性,需要曲线操作下:
参考内容:
https://cloud.tencent.com/developer/article/1664195 https://www.shangyouw.cn/wenjian/arc2264.html

由于Excel文件的本质:一个包含XML、图片文件的压缩文件夹-压缩文件,所以可以通过把xlsx文件改为压缩包,然后提取压缩包内的xml文件信息。
2.7 代码 ‘文件信息提取.py’可以提取文件的信息,未获取的信息留空;

2.8 信息只运行一次,如果多次运行,出现重复数据,后续的格式调整代码会报错。

2.9 代码 ‘格式调整.py’是处理所获得的文件信息,会创建一个中间文件‘处理的中间数据_可删除.xlsx’;

2.10 代码中使用到xlwings模块,用来处理自适应列宽,其实超链接部分也可以使用这模块,但是目前没有详细了解,这里还是先使用openpyxl模块。

三 代码主体部分。
3.1 文件信息提取.py
import os
from docx import Document
import zipfile
import lxml
from pptx import Presentation
from PyPDF2 import PdfFileReader
import pandas as pd
import glob


# 提取 docx文件的详细信息
def extract_docx(filename, data, start_path, data_path):
    doc = Document(filename)
    data["文件路径"] = start_path + filename
    data["author作者"] = doc.core_properties.author
    data["created创建时间"] = doc.core_properties.created
    data["modified修改时间"] = doc.core_properties.modified
    data["文件格式"] = "docx"
    data.to_csv(data_path, mode="a")
    
# 提取 xlsx文件的详细信息
def extract_xlsx(filename, data, start_path, data_path):
    zf = zipfile.ZipFile(filename)
    ns = {
        "dc": "http://purl.org/dc/elements/1.1/",
        "dcterms": "http://purl.org/dc/terms/",
        "cp": "http://schemas.openxmlformats.org/package/2006/metadata/core-properties",
    }
    doc = lxml.etree.fromstring(zf.read("docProps/core.xml"))

    data["文件路径"] = start_path + filename
    # 这里不加try,在读取后面生成的中间文件时会报错
    try:
        data["author作者"] = doc.xpath("//dc:creator", namespaces=ns)[0].text
    except:
        data["author作者"] = '0'
    data["created创建时间"] = doc.xpath("//dcterms:created", namespaces=ns)[0].text
    data["modified修改时间"] = doc.xpath("//dcterms:modified", namespaces=ns)[0].text
    data["文件格式"] = "xlsx"
    data.to_csv(data_path, mode="a")
    
# 提取 pptx文件的详细信息
def extract_pptx(filename, data, start_path, data_path):
    prs = Presentation(filename)
    data["文件路径"] = start_path + filename
    data["author作者"] = prs.core_properties.author
    data["created创建时间"] = prs.core_properties.created
    data["modified修改时间"] = prs.core_properties.modified
    data["文件格式"] = "pptx"
    data.to_csv(data_path, mode="a")

# 提取 pdf文件的详细信息
def extract_pdf(filename, data, start_path, data_path):
    inputPdf = PdfFileReader(open(filename, "rb"))
    docInfo = inputPdf.getDocumentInfo()
    data["文件路径"] = start_path + filename
    data["author作者"] = docInfo['/Author']
    data["created创建时间"] = docInfo['/CreationDate'][2:]
    data["modified修改时间"] = docInfo['/ModDate'][2:]
    data["文件格式"] = "pdf"
    data.to_csv(data_path, mode="a")

if __name__ == "__main__":
    start_path = os.getcwd() + "\\"
    data_path = "获取的数据.csv"
    data = pd.DataFrame(
        {
            "文件路径": [0],
            "author作者": [0],
            "created创建时间": [0],
            "modified修改时间": [0],
            "文件格式": [0],
        },
        index=[0],
    )
    for filename in glob.glob("**/*", recursive=True):
        if filename.endswith(".docx"):
            extract_docx(filename, data, start_path, data_path)

        elif filename.endswith(".xlsx"):
            extract_xlsx(filename, data, start_path, data_path)

        elif filename.endswith(".pptx"):
            extract_pptx(filename, data, start_path, data_path)

        elif filename.endswith(".pdf"):
            extract_pdf(filename, data, start_path, data_path)
3.2 格式调整.py
import pandas as pd
from openpyxl import load_workbook
from datetime import datetime
import xlwings as xw

def fun(x):
    if 'Z' in x:
        return datetime.strptime(x,"%Y-%m-%dT%H:%M:%SZ").strftime("%Y-%m-%d %H:%M:%S")
    elif '+' in x:
        return datetime.strptime(x,"%Y%m%d%H%M%S+08'00'").strftime("%Y-%m-%d %H:%M:%S")
    else:
        return x

# 数据处理部分
df = pd.read_csv("获取的数据.csv")
df = df.drop_duplicates(subset=["文件路径"], keep=False)
df.drop(["Unnamed: 0"], axis=1, inplace=True)
df['created创建时间'] = df['created创建时间'].apply(lambda x: fun(x))
df['modified修改时间'] = df['modified修改时间'].apply(lambda x: fun(x))
max_len = max(df["文件路径"].apply(lambda x: len(x.split("\\"))))
for i in range(1, max_len + 1):
    df[f"路径{i}层"] = df["文件路径"].str.split("\\", expand=True)[i - 1]
df = df.fillna("0")
df.replace('0','',inplace=True)
df.to_excel("可删除文件.xlsx")

# 这里主要是加超链接
workbook = load_workbook(filename="可删除文件.xlsx")
sheet = workbook.active
for cell in sheet["B"][1:]:
    filename = cell.value.split("\\")[-1]
    cell.value = '=HYPERLINK("{}","{}")'.format(cell.value, filename)
workbook.save(filename="文件信息.xlsx")

# 使用xlwings ,让列宽自适应调整
# 这个模块会自动打开excel,win10如果不点office更新,偶尔会报错
wb = xw.Book('文件信息.xlsx')
wb.sheets['sheet1'].autofit()
wb.save('文件信息.xlsx')