victory的博客

长安一片月,万户捣衣声

0%

识别加密word文件

Python本身是难以识别word文件的加密状态的,那我们可以考虑利用程序在处理有密码的文档的时候的报错信息来进行处理。word文件有两种密码,一种是“打开密码”,另一种是“修改密码”。对于前者,若不输入正确的密码,是无法打开文件查看内容的;对于后者,即使不知道密码,还是可以用只读模式打开文件,查看内容并另存为新的文件的。
因此对于设置了“修改密码”的doc文件,并不影响用如下程序另存为docx文件。只是在另存之前,窗口会弹出如下对话框,我们只需要点击一下“只读”即可,程序就能正常运行下去。
如果设置了“打开密码”,程序在运行的时候也会弹出对话框,让输入密码。如果输入正确的密码,程序也是可以运行的;如果不知道密码或输入错误密码,则程序会出现如下的“com_error”错误。如果不知道密码,可以加入try..except..语句,让程序在except语句中将这个文件移动到名字为“有密码文件”的文件夹,以便后续处理。

阅读全文 »

分块拆分txt文件中的数据

代码:

# -*- coding:utf-8 -*-
# 读取txt文件中的数据
file = open("数据.txt")
lines = file.readlines()
# print(lines[:5])

data = {}  # 储存分割的数据
line_list = []  # 中转列表
last_id = "start"  # 数据分块标识
for line in lines:
    row_data = line.split(" ")  # 将一行数据按空格分隔
    ID = row_data[0]  # 获得ID
    if last_id == "start":  # 用于处理数据第一行
        line_list.append(line)  # 将第一行数据放入中转列表
    else:  # 不是第一行数据,则按如下执行
        if ID != last_id:  # 如果出现新的数据块
            if last_id in data:  # 新的数据块的ID已存在字典data中
                data[last_id].append(line_list)  # 将中转列表的数据添加到对应的ID中
            else:  # 新的数据快的ID不在字典data中
                data[last_id] = [line_list]  # 将上一个数据块加入对应的ID
            line_list = [line]  # 将中转列表清空,并放入新数据快的第一行数据
        else:  # 没出现新的数据块
            line_list.append(line)  # 将数据继续加入中转列表
    last_id = ID  # 每处理一行,将分块标识last_id更行为最新的ID

# 将最后一个文字块的数据放入字典
if last_id in data:
    data[last_id].append(line_list)
else:
    data[last_id] = [line_list]

# print(data['89031'])

# for i in data.keys():
#     for block in data[i]:
#         print(block)
#         print("- -"*50)


# 写入数据函数
def to_txt(filename, data_list):  # filename为写入文件的名字,data为要写入数据列表
    file = open("分块\\" + filename + '.txt', 'a')
    for i in range(len(data_list)):
        file.write(data_list[i])
    file.close()  # 保存数据并关闭


# 批量写入数据
for ID in data.keys():
    for i in range(len(data[ID])):
        to_txt(f"{ID}_{i+1}", data[ID][i])
        

数据.txt

Tkinter制作python程序的图形化界面

代码:

from os import listdir, getcwd
from xlrd import open_workbook, xldate
from datetime import datetime
from time import time, localtime, strftime
from openpyxl import Workbook
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment
from tkinter import Tk, Entry, Button, Listbox, X, Y, END, Scrollbar, RIGHT, BOTTOM, HORIZONTAL
from tkinter.filedialog import askdirectory


class MainGUI():
    def __init__(self):
        myWindow = Tk()
        myWindow.title("领料记录汇总")
        # 设置窗口大小
        myWindow.geometry('590x400')
        myWindow.iconbitmap(getcwd() + "\\PO.ico")
        # 增加文本框
        self.input_entry = Entry(myWindow, highlightcolor='red', highlightthickness=1)
        self.input_entry.place(x=10, y=10, width=480, height=30)
        self.btn_in = Button(myWindow, text='输入文件目录', command=self.select_dir1, width=10, height=1)
        self.btn_in.place(x=500, y=10)

        self.output_entry = Entry(myWindow, highlightcolor='blue', highlightthickness=1)
        self.output_entry.place(x=10, y=50, width=480, height=30)
        self.btn_out = Button(myWindow, text='输出文件目录', command=self.select_dir2, width=10, height=1)
        self.btn_out.place(x=500, y=50)

        self.btn_run = Button(myWindow, text='执行汇总', width=10, height=1, command=self.Summary_data)
        self.btn_run.place(x=500, y=90)
        # 增加列表框
        self.result_show = Listbox(myWindow, bg='DarkSeaGreen')  # yscrollcommand = scroll_bar,
        self.result_show.place(x=10, y=130, width=570, height=260)
        self.sbY = Scrollbar(self.result_show, command=self.result_show.yview)  # 在列表框中增加Y轴滚动条
        self.sbY.pack(side=RIGHT, fill=Y)
        self.result_show.config(yscrollcommand=self.sbY.set)
        self.sbX = Scrollbar(self.result_show, command=self.result_show.xview, orient=HORIZONTAL)  # 在列表框中增加X轴滚动条
        self.sbX.pack(side=BOTTOM, fill=X)
        self.result_show.config(xscrollcommand=self.sbX.set)

        myWindow.mainloop()

    def select_dir1(self):
        self.input_entry.delete(0, END)
        self.input_entry.insert(0, askdirectory(initialdir="D:\\"))

    def select_dir2(self):
        self.output_entry.delete(0, END)
        self.output_entry.insert(0, askdirectory(initialdir="D:\\"))

    # 读取xls文件中的数据
    def Get_data(self, file):
        wb = open_workbook(file)  # 读取工作簿
        ws = wb.sheets()[0]  # 选第一个工作表
        data = {}
        for row in range(7, ws.nrows - 2):
            dept = ws.cell(2, 16).value  # 部门
            dept_id = ws.cell(3, 16).value  # 部门编号
            dt = ws.cell(row, 0).value  # 时间
            if type(dt) is float:
                date_time = xldate.xldate_as_datetime(dt, 0)
            else:
                date_time = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
            business = ws.cell(row, 2).value  # 业务类型
            model = ws.cell(row, 3).value  # 品种
            qty = ws.cell(row, 4).value  # 数量
            unit_price = ws.cell(row, 6).value  # 单价
            price = ws.cell(row, 8).value  # 总价
            reward = ws.cell(row, 9).value  # 额外值
            discount = ws.cell(row, 11).value  # 调整
            balance = ws.cell(row, 13).value  # 剩余
            location = str(ws.cell(row, 15).value).strip()  # 库位
            operator = ws.cell(row, 17).value  # 操作员
            date = date_time.date()  # 日期
            time = date_time.time()  # 时间
            info_list = [dept, dept_id, date_time, business, model, qty, unit_price, price, reward, discount,
                         balance, location, operator, date, time]
            data.setdefault(date, [])  # 以日期为键
            if info_list[3] != "备注":  # 不要业务类型为“备注”的数据
                data[date].append(info_list)
        # 增加当日领取次数
        for key in data.keys():
            for i in data[key]:
                i.append(len(data[key]))

        return data

    def Get_file_path(self, path):
        files = []
        for file in listdir(path):
            if file.endswith(".xls"):  # 排除文件夹内的其它干扰文件
                files.append(path + "\\" + file)
        return files

    def Get_current_time(self):
        time_stamp = time()  # 当前时间的时间戳
        local_time = localtime(time_stamp)  #
        str_time = strftime('%Y-%m-%d %H.%M.%S', local_time)
        return str_time

    def Summary_data(self):
        thin = Side(border_style="thin", color="000000")  # 定义边框粗细及颜色
        title = ['部门', '部门编号', '时间', '业务类型', '品种', '数量', '单价', '金额', '额外值',
                 '调整', '剩余', '库位', '操作员', '领取日期', '领取时间', '领取次数']

        wb = Workbook()
        ws = wb.active

        ws.merge_cells("A1:P1")
        ws.cell(1, 1).value = "领料明细汇总表"
        ws.cell(1, 1).font = Font(name=u'黑体', bold=True, size=18)
        ws.row_dimensions[1].height = 22.2
        ws.cell(1, 1).alignment = Alignment(horizontal="center", vertical="center")
        ws.append(title)

        # 插入数据
        files = self.Get_file_path(self.input_entry.get())  # get()获取文本编辑框中的输入文件目录,并获取目录下的xls文件
        for file in files:
            data = self.Get_data(file)
            for key in data.keys():
                for i in data[key]:
                    ws.append(i)
            f = f"{file} 的内容已加入总表."  # 创建一个显示项
            self.result_show.insert("end", f)  # 将结果添加到列表框中

        # 设置字号,对齐,缩小字体填充,加边框
        # Font(bold=True)可加粗字体
        for row_number in range(2, ws.max_row + 1):
            for col_number in range(1, 17):
                c = ws.cell(row=row_number, column=col_number)
                c.font = Font(size=9)
                c.border = Border(top=thin, left=thin, right=thin, bottom=thin)
                c.alignment = Alignment(horizontal="left", vertical="center")

        col_name = list("ABCDEFGHIJKLMNOP")
        col_width = [8, 8, 16, 8, 16, 8, 8, 9.8, 8, 8, 8, 11, 8.3, 9, 8, 8]
        for i in range(len(col_name)):
            ws.column_dimensions[col_name[i]].width = col_width[i]

        ws.column_dimensions.group('I', 'K', hidden=True)
        ws.column_dimensions.group('N', 'O', hidden=True)

        wb.save(f"{self.output_entry.get()}\\领料明细汇总表{self.Get_current_time()}.xlsx")
        f = "-" * 100  # 创建分割线
        self.result_show.insert("end", f)  # 将分割线添加到列表框
        f = f"领料明细汇总表{self.Get_current_time()}.xlsx 已生成,请去输出文件夹查看."  # 创建一个显示项
        self.result_show.insert("end", f)  # 将结果添加到列表框
        f = " " * 100
        self.result_show.insert("end", f)  # 将以上空格添加到列表框


if __name__ == "__main__":
    MainGUI()

python程序打包

通常情况我们在pycharm中写的python程序只能在安装了python的电脑上运行,那么如何移植到其他电脑上也能运行呢?
我们可以将py文件打包成可执行程序(exe文件).

步骤:

1. pyinstaller库安装

pip install pyinstaller -i https://pypi.doubanio.com/simple/

2.打包

pyinstaller -D program.py ---> 打包成一个文件夹(默认操作)
pyinstaller -F program.py ---> 打包成单个可执行文件

程序运行后,会在目录生成一个文件:
1.program.spec(打包规则)
三个文件夹:
1.__pycache __(Python版本信息)
2.build(存储日志文件)
3.dist(储存可执行文件即相关的文件夹)
注:打包完成后,除了dist文件夹,其它都可以删除,没什么用。

3.将打包好的文件制作成一个安装文件

使用NSIS文件夹压缩器来制作安装文件。

python制作图形用户界面让操作可视化

代码:

import sys
import os
from PyQt5 import QtWidgets
from PyQt5.QtGui import QIcon
import xlrd
import datetime
import time
from openpyxl import Workbook
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment


class MainGUI(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("领料明细汇总")
        self.resize(800, 400)
        self.main_widget = QtWidgets.QWidget()
        self.main_widget_layout = QtWidgets.QGridLayout()
        self.main_widget.setLayout(self.main_widget_layout)

        self.input = QtWidgets.QLineEdit()
        self.input_btn = QtWidgets.QPushButton("选择输入文件夹")
        self.output = QtWidgets.QLineEdit()
        self.output_btn = QtWidgets.QPushButton("选择输出文件夹")
        self.show_result = QtWidgets.QListWidget()
        self.run = QtWidgets.QPushButton("执行汇总")

        self.main_widget_layout.addWidget(self.input, 0, 0, 1, 2)
        self.main_widget_layout.addWidget(self.input_btn, 0, 2, 1, 1)
        self.main_widget_layout.addWidget(self.output, 1, 0, 1, 2)
        self.main_widget_layout.addWidget(self.output_btn, 1, 2, 1, 1)
        self.main_widget_layout.addWidget(self.run, 2, 2, 1, 1)
        self.main_widget_layout.addWidget(self.show_result, 3, 0, 3, 3)

        self.setCentralWidget(self.main_widget)

        self.input_btn.clicked.connect(self.Choice_dir_input)  # 将"选择输入文件夹"按钮绑定Choice_dir_input函数
        self.output_btn.clicked.connect(self.Choice_dir_output)  # 将"选择输出文件夹"按钮绑定Choice_dir_output函数
        self.run.clicked.connect(self.Summary_data)  # “执行汇总”按钮绑定Summary_data函数

    def Choice_dir_input(self):
        # 选择目录操作
        dir_path = QtWidgets.QFileDialog.getExistingDirectory(self, "请选择文件夹路径", "D:\\")
        # 将选择的目录显示在文本编辑框中
        self.input.setText(dir_path)

    def Choice_dir_output(self):
        dir_path = QtWidgets.QFileDialog.getExistingDirectory(self, "请选择文件夹路径", "D:\\")
        self.output.setText(dir_path)

    def Get_data(self, file):
        '''获取单个Excel文件中的资料'''
        wb = xlrd.open_workbook(file)
        ws = wb.sheets()[0]
        data = {}
        for row in range(7, ws.nrows - 2):
            card_id = ws.cell(2, 16).value
            car = ws.cell(3, 16).value
            dt = ws.cell(row, 0).value
            if type(dt) is float:
                date_time = xlrd.xldate.xldate_as_datetime(dt, 0)
            else:
                date_time = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
            business = ws.cell(row, 2).value
            model = ws.cell(row, 3).value
            qty = ws.cell(row, 4).value
            unit_price = ws.cell(row, 6).value
            price = ws.cell(row, 8).value
            reward = ws.cell(row, 9).value
            discount = ws.cell(row, 11).value
            balance = ws.cell(row, 13).value
            location = str(ws.cell(row, 15).value).strip()
            operator = ws.cell(row, 17).value
            date = date_time.date()
            time = date_time.time()
            info_list = [card_id, car, date_time, business, model, qty, unit_price, price, reward, discount,
                         balance, location, operator, date, time]
            data.setdefault(date, [])
            if info_list[3] != "备注":
                data[date].append(info_list)
        # 增加当日加油次数
        for key in data.keys():
            for i in data[key]:
                i.append(len(data[key]))
        return data

    def Get_file_path(self, path):
        files = []
        for file in os.listdir(path):
            if file.endswith(".xls"):  # 排除文件夹内的其它干扰文件
                files.append(path + "\\" + file)
        return files

    def Get_current_time(self):
        time_stamp = time.time()  # 当前时间的时间戳
        local_time = time.localtime(time_stamp)  #
        str_time = time.strftime('%Y-%m-%d %H.%M.%S', local_time)
        return str_time

    def Summary_data(self, files):
        thin = Side(border_style="thin", color="000000")  # 定义边框粗细及颜色
        title = ['部门', '部门编号', '时间', '业务类型', '品种', '数量', '单价', '金额', '额外值',
                 '调整', '剩余', '库位', '操作员', '领取日期', '领取时间', '领取次数']

        wb = Workbook()
        ws = wb.active
        ws.merge_cells("A1:P1")
        ws.cell(1, 1).value = "领料明细汇总表"
        ws.cell(1, 1).font = Font(name=u'黑体', bold=True, size=18)
        ws.row_dimensions[1].height = 22.2
        ws.cell(1, 1).alignment = Alignment(horizontal="center", vertical="center")
        ws.append(title)

        # 插入数据
        files = self.Get_file_path(self.input.text())  # 获取文本编辑框中的输入文件目录,并获取目录下的xls文件
        for file in files:
            data = self.Get_data(file)
            for key in data.keys():
                for i in data[key]:
                    ws.append(i)
            f = QtWidgets.QListWidgetItem(f"{file} 的内容已加入总表.")  # 创建一个显示项
            self.show_result.addItem(f)  # 将结果添加到部件中

        # 设置字号,对齐,缩小字体填充,加边框
        # Font(bold=True)可加粗字体
        for row_number in range(2, ws.max_row + 1):
            for col_number in range(1, 17):
                c = ws.cell(row=row_number, column=col_number)
                c.font = Font(size=9)
                c.border = Border(top=thin, left=thin, right=thin, bottom=thin)
                c.alignment = Alignment(horizontal="left", vertical="center")

        col_name = list("ABCDEFGHIJKLMNOP")
        col_width = [8, 8, 16, 8, 16, 8, 8, 9.8, 8, 8, 8, 11, 8.3, 9, 8, 8]
        for i in range(len(col_name)):
            ws.column_dimensions[col_name[i]].width = col_width[i]

        ws.column_dimensions.group('I', 'K', hidden=True)
        ws.column_dimensions.group('N', 'O', hidden=True)

        wb.save(f"{self.output.text()}\\领料明细汇总表{self.Get_current_time()}.xlsx")
        f = QtWidgets.QListWidgetItem(f"\n领料明细汇总表{self.Get_current_time()}.xlsx 已生成,请去输出文件夹查看.")  # 创建一个显示项
        self.show_result.addItem(f)  # 将结果添加到部件中


def main():
    app = QtWidgets.QApplication(sys.argv)
    app.setWindowIcon(QIcon("PO.ico"))  # 设置界面左上角图标
    gui = MainGUI()
    gui.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
    

Python汇总各单位Excel档领料记录并加总每日领用次数

xlrd详解
代码:

import time
import xlrd
import datetime


# 读取xls文件中的数据
def Get_data(file):
    wb = xlrd.open_workbook(file)  # 读取工作簿
    ws = wb.sheets()[0]  # 选第一个工作表
    data = {}

    for row in range(7, ws.nrows - 2):
        dept = ws.cell(2, 16).value  # 部门
        dept_id = ws.cell(3, 16).value  # 部门编号
        dt = ws.cell(row, 0).value  # 时间
        if type(dt) is float:
            date_time = xlrd.xldate.xldate_as_datetime(dt, 0)
        else:
            date_time = datetime.datetime.strptime(dt, '%Y-%m-%d %H:%M:%S')
        business = ws.cell(row, 2).value  # 业务类型
        model = ws.cell(row, 3).value  # 品种
        qty = ws.cell(row, 4).value  # 数量
        unit_price = ws.cell(row, 6).value  # 单价
        price = ws.cell(row, 8).value  # 总价
        reward = ws.cell(row, 9).value  # 额外值
        discount = ws.cell(row, 11).value  # 调整
        balance = ws.cell(row, 13).value  # 剩余
        location = str(ws.cell(row, 15).value).strip()  # 库位
        operator = ws.cell(row, 17).value  # 操作员
        date = date_time.date()  # 日期
        time = date_time.time()  # 时间
        info_list = [dept, dept_id, date_time, business, model, qty, unit_price, price, reward, discount,
                     balance, location, operator, date, time]
        data.setdefault(date, [])  # 以日期为键
        if info_list[3] != "备注":  # 不要业务类型为“备注”的数据
            data[date].append(info_list)

    # 增加当日领取次数
    for key in data.keys():
        for i in data[key]:
            i.append(len(data[key]))

    return data


import os  # 用于获取目标文件所在路径

path = os.getcwd() + "\\记录\\"  # 文件夹绝对路径
files = []
for file in os.listdir(path):
    if file.endswith(".xls"):  # 只获取".xls"后缀的文件
        files.append(path + file)
# print(files)

# Get_data(files[0])


def Get_current_time():
    time_stamp = time.time()  # 当前时间的时间戳
    local_time = time.localtime(time_stamp)  #
    str_time = time.strftime('%Y-%m-%d %H.%M.%S', local_time)
    return str_time


# print(Get_current_time())

# 汇总数据到主文件
from openpyxl import Workbook
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment  # 设置单元格格式

thin = Side(border_style="thin", color="000000")  # 定义边框粗细及颜色
title = ['部门', '部门编号', '时间', '业务类型', '品种', '数量', '单价', '金额', '额外值',
         '调整', '剩余', '库位', '操作员', '领取日期', '领取时间', '领取次数']

wb = Workbook()
ws = wb.active
ws.merge_cells("A1:P1")  # 合并首行单元格
ws.cell(1, 1).value = "领料明细汇总表"
ws.cell(1, 1).font = Font(name=u'黑体', bold=True, size=18)
ws.row_dimensions[1].height = 22.2  # 设置首行行高
ws.cell(1, 1).alignment = Alignment(horizontal="center", vertical="center")  # 设置对齐
ws.append(title)  # 写入字段行

# 写入各部门领料的数据
for file in files:
    data = Get_data(file)
    for key in data.keys():
        for i in data[key]:
            ws.append(i)

# 设置字号,对齐,缩小字体填充,加边框
# Font(bold=True)可加粗字体
for row_number in range(2, ws.max_row + 1):
    for col_number in range(1, 17):
        c = ws.cell(row=row_number, column=col_number)
        c.font = Font(size=9)
        c.border = Border(top=thin, left=thin, right=thin, bottom=thin)
        c.alignment = Alignment(horizontal="left", vertical="center")

# 设置列宽
col_name = list("ABCDEFGHIJKLMNOP")
col_width = [8, 8, 16, 8, 16, 8, 8, 9.8, 8, 8, 8, 11, 8.3, 9, 8, 8]
for i in range(len(col_name)):
    ws.column_dimensions[col_name[i]].width = col_width[i]

# 分组隐藏列
ws.column_dimensions.group('I', 'K', hidden=True)
ws.column_dimensions.group('N', 'O', hidden=True)

wb.save(f"领料明细汇总表{Get_current_time()}.xlsx")

记录:
工程部领料明细.xls
生产部领料明细.xls

Python检查word文件中的特殊标记词是否与文件名中的一致

公司的部分文件分为“内部”和“外部”。正常情况下,这个标识在文件名及文件首页左上角都有标注。然鹅,有时候操作一下,忘记改了,或者忘记标注了。就需要回头去一个一个地整理,非常麻烦。这种重复的,繁杂的操作,尽快冲Python来,人类还是应该多做做其它更有意思的事。

代码:

import os
from win32com import client as wc  # 导入模块
import docx
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体

# 将文件夹内的所有doc转存为docx文件
path = os.getcwd() + "\\文件\\"  # 文件夹绝对路径
files = []
for file in os.listdir(path):
    if file.endswith(".doc"):  # 排除文件夹内的其他干扰文件,只获取".doc"后缀的word文件
        files.append(path+file)

word = wc.Dispatch("Word.Application")  # 打开word应用程序
for file in files:
    doc = word.Document(file)  # 打开word文件
    doc.SaveAs("{}x".format(file), 12)  # 另存为后缀为".docx"的文件,其中参数12指docx文件
    doc.Close()  # 关闭原来word文件
word.Quit()

for file in files:  # 删除doc文件
    os.remove(file)

# 获取所有docx文件路径
docx_files = []
for file in os.listdir(path):  # 排除文件夹内的其它干扰文件,只获取".doc"后缀的word文件
    if file.endswith(".docx"):
        docx_files.append(path+file)

counter = 0  # 计数器,用于记录有多少文件没被处理

for file in docx_files:
    file_head = file.split('.')[0].rstrip()  # 文件名头,类似这样的“C:\\Users\\文件\\测试”
    file_tail = file.split('\\')[-1]  # 文件名尾,类似这样“测试.docx”
    mark_words = ["公开", "内部"]
    mark_fileName = file_head[-3:-1]  # 文件名中倒数第2,3个文字

    doc = docx.Document(file)
    mark_doc = doc.paragraphs[0].text  # 文件中首段文字
    # 比对标记词
    if mark_doc in mark_words:  # 判断文件中有无标记
        if mark_fileName in mark_words:  # 判断文件名中有无标记
            if mark_doc == mark_fileName:  # 如果二者标记相同
                counter += 1
                pass
            else:  # 二者标记不同
                os.rename(file, file.replace(mark_fileName, mark_doc))  # 重命名文件
                print(f"【{file_tail}】文件名重命名标识为【{mark_doc}】")
        else:
            os.rename(file, f"{file_head}({mark_doc}).docx")  # 文件名中无标记,则加标记
            print(f"【{file_tail}】文件名增加标识为【{mark_doc}】")
    else:
        # 文中无标记,则在首段前插入一段,写入标记
        p = doc.paragraphs[0]
        pNew = p.insert_paragraph_before()
        run = pNew.add_run(mark_words[0])  # 写为“公开”
        # 字体设置
        run.font.size = Pt(16)
        run.font.name = "黑体"
        r = run._element.rPr.rFonts
        r.set(qn("w:eastAsia"), "黑体")

        doc.save(file)
        print(f"【{file_tail}】内容增加标识为【{mark_words[0]}】")

        if mark_fileName in mark_words:  # 查看文件名中是否有标记
            if mark_fileName == mark_words[0]:  # 标记是否为“公开”
                pass
            else:  # 标记不是“公开”则替换
                os.rename(file, file.replace(mark_fileName, mark_words[0]))  # 重命名文件
                print(f"【{file_tail}】文件名重命名标识为【{mark_words[0]}】")
        else:
            os.rename(file, f"{file_head}({mark_words[0]}).docx")  # 文件名中无标记,则加标记
            print(f"【{file_tail}】文件名增加标识为【{mark_words[0]}】")

print(f"完成!共检查{len(docx_files)}个文件,处理了 {len(docx_files) - counter} 个文件。")

Python爬虫~已爬取目标网站所有文章,后续如何只获取新文章?

代码:

print("文章刷新中......")

# 定义函数,获取想要的文章并批量写入word文件
import requests
from bs4 import BeautifulSoup
import docx
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体
import random
import time
import os


def Get_article_to_word(url, date):
    user_agent_list = [
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15"
        ]
    header = {'User-Agent': random.choice(user_agent_list)}
    wb_data = requests.get(url, headers=header)
    soup = BeautifulSoup(wb_data.content)
    title = soup.select('.headword')[0].text.strip()  # 获得标题
    content1 = soup.select(".MsoNormal")  # 针对正文布局为 class = "MsoNormal"
    content2 = soup.select("#art_content")  # 针对正文布局为 id = "art_content"

    doc = docx.Document()  # 新建空白word文档
    # 设定全局字体
    doc.styles['Normal'].font.name = u'宋体'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

    # 写入标题行,并设置字体格式
    p = doc.add_paragraph()
    r = p.add_run(title)
    r.bold = True
    r.font.size = Pt(18)

    doc.add_paragraph(date)  # 写入日期
    doc.add_paragraph(url)  # 写入文章链接

    dirs = os.getcwd() + "\\文章"
    if not os.path.exists(dirs):
        os.makedirs(dirs)
    # 写入正文
    for i in content2:
        doc.add_paragraph(i.text)
    for i in content1:
        doc.add_paragraph(i.text)
    doc.save(f"{dirs}\\{title}.docx")


# 判断网站是否有新文章
import requests
import json

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 '
                  'Safari/537.36'}
form_data = {'_q': 'Article.list',
             'siteId': '7e0b3b27-2622-4aa7-b6f8-abfe5c5df922',
             'catalogId': '34f92da3-d6d0-4e96-899f-d7f581c18162',
             'pub': 'true',
             'limit': 150,  # 网站更新速度较慢,每次查看是否有更新的时候,只获取前10页共150篇文章的信息
             'start': 1}

# 这是异步加载,请求方法是POST
url = "http://www.bicpa.org.cn/dtzj/zxgg/getArticles.action"
res = requests.post(url, data=form_data, headers=header)
article_data0 = res.text.split("{success:true,datas:")[1]  # 去掉字符串前面的无用信息“{success:true,datas:”
article_data = article_data0.split(",total:")[0]  # 去掉字符串后面的无用信息“,total:xxxx}”
obj = json.loads(article_data)

# 载入数据库中的所有链接,作为判断基准
f = open(os.getcwd() + '\\links.txt', 'r')
link_database = f.read()  # 读取成一个大字符串

# 将所有新文章链接写入文本文件
path = r"http://www.bicpa.org.cn"
links_file = open('links.txt', 'a')  # 避免覆盖已有数据,用添加模式`a`写入
counter_link = 0  # 新文章链接计数器
counter_download = 0  # 新下载文章计数器
for info in obj:
    link = path + info['url'] + info['primaryKey'] + ".html"  # 拼接链接信息
    if link in link_database:  # 判断新提取的链接是否已存在于数据库
        pass
    else:
        links_file.write(link + "\n")  # 写入链接信息
        counter_link += 1

        # 下载标题含有"委员会专家提示"的文章
        if "委员会专家提示" in info['title']:
            Get_article_to_word(link, info["publishDate"])  # 调用写好的函数,下载文章到word文件
            counter_download += 1  # 每下载一篇文章,计数器增加1

links_file.close()  # 写完后关闭文件

# 显示每次的结果
if counter_link == 0:
    print("没有文章更新!")
else:
    print(f"共获取到 {counter_link} 篇新文章的链接,并加入数据库。")

if counter_download == 0:
    print("没有'委员会专家提示'文章更新!")
else:
    print(f"共下载 {counter_download} 篇'委员会专家提示'新文章,请到文件夹查看。")

print("程序运行完成,关闭窗口退出.")
input()

python爬虫爬取会计师网站的指定文章

还没学习爬虫,没看懂!有缘再见!后会有期!

贴上代码:

import requests
import os
import json


print("开始爬取文章......")
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 '
                  'Safari/537.36'}

form_data = {'_q': 'Article.list',
             'siteId': '7e0b3b27-2622-4aa7-b6f8-abfe5c5df922',
             'catalogId': '34f92da3-d6d0-4e96-899f-d7f581c18162',
             'pub': 'true',
             'limit': 5000,
             'start': 1}

# 这是异步加载,请求方法是POST
url = "http://www.bicpa.org.cn/dtzj/zxgg/getArticles.action"
res = requests.post(url, data=form_data, headers=header)

article_data0 = res.text.split("{success:true,datas:")[1]  # 去掉字符串前面的无用信息“{success:true,datas:”
article_data = article_data0.split(",total:")[0]  # 去掉字符串后面的无用信息“,total:4946}”

obj = json.loads(article_data)
# 获取标题含有“委员会专家提示”的文章的标题,发布时间和链接
path = r"http://www.bicpa.org.cn"
articles = []
for info in obj:
    if "委员会专家提示" in info['title']:
        article = {
            "标题": info['title'].strip(),  # strip()去除首尾空格
            "发布时间": info['publishDate'],
            "链接": path + info['url'] + info['primaryKey'] + ".html"
        }
        articles.append(article)


import requests
from bs4 import BeautifulSoup
import docx
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体
import random
import time


# 获取想要的文章并批量写入word文件
def Get_article_to_word(url, date):
    user_agent_list = [
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15"
    ]
    header = {'User-Agent': random.choice(user_agent_list)}
    wb_data = requests.get(url, headers=header)
    soup = BeautifulSoup(wb_data.content)
    title = soup.select('.headword')[0].text.strip()  # 获得标题
    content1 = soup.select(".MsoNormal")  # 针对正文布局为 class = "MsoNormal"
    content2 = soup.select("#art_content")  # 针对正文布局为 id = "art_content"

    doc = docx.Document()  # 新建空白word文档
    # 设定全局字体
    doc.styles['Normal'].font.name = u'宋体'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

    # 写入标题行,并设置字体格式
    p = doc.add_paragraph()
    r = p.add_run(title)
    r.bold = True
    r.font.size = Pt(18)

    doc.add_paragraph(date)  # 写入日期
    doc.add_paragraph(url)  # 写入文章链接

    dirs = os.getcwd() + "\\文章"
    if not os.path.exists(dirs):
        os.makedirs(dirs)

    # 写入正文
    for i in content2:
        doc.add_paragraph(i.text)
    for i in content1:
        doc.add_paragraph(i.text)
    doc.save(f"{dirs}\\{title}.docx")


# 遍历所有文章的链接,调用以上函数执行
for art in articles:
    Get_article_to_word(art["链接"], art["发布时间"])
    print("{} 下载完成。".format(art['标题']))
    if articles.index(art) % 30 == 29:  # 每获取30篇文章,暂停5秒,避免频繁请求被服务器切断连接
        time.sleep(5)

print(f"共下载 {len(articles)} 篇文章。")
print("程序运行完成,关闭窗口退出.")
input()