victory的博客

长安一片月,万户捣衣声

0%

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()

从多路径多Excel表中获取数据并存入新表

实现代码:

import os

work_path = os.getcwd() + "\\资料"  # 获取当前工作路径,指定“资料”文件夹
# 获取路径下所有.xlsx文件,并存入列表
pathss = []  # 存储文件夹内所有文件的路径(包括子目录内的文件)
for root, dirs, files in os.walk(work_path):
    path = [os.path.join(root, name) for name in files]  # 将目录和文件名连接起来,才是完整文件路径
    for i in range(len(path)):  # 遍历所有文件的地址
        if path[i].endswith(".xlsx"):  # 只提取后缀为xlsx的文件
            pathss.append(path[i])

# 定义函数,获取Excel表格中的ID数据
from openpyxl import load_workbook  # 用于读取Excel中的信息


def Get_system_ID(file):
    wb = load_workbook(file)
    ws = wb.active

    ID_list = []
    for row in range(2, ws.max_row + 1):
        ID = ws["A" + str(row)].value  # ID信息在A列
        if ID != None:  # 过滤空值
            ID_list.append(ID)
    return ID_list


# 获取数据,存入总列表
total_list = []
for file in pathss:
    info = Get_system_ID(file)
    total_list += info

# 写入数据到新的excel表,并设置格式
from openpyxl import Workbook
from openpyxl.styles import Font, colors, Alignment  # 字体,颜色,对齐
from openpyxl.styles import PatternFill  # 单元格填充

wb = Workbook()  # 新建Excel工作簿
ws = wb.active  # 使用活动工作表
ws.column_dimensions['A'].width = 18.5  # 设定A列宽度
ws.cell(row=1, column=1, value="ID")  # 写入字段名
color_fill = PatternFill(fill_type='solid', fgColor="B3CFA1")  # 设置底色
ws.cell(row=1, column=1).fill = color_fill  # 填充底色

# 批量从列表中提取数据并写入
for row in range(1, len(total_list) + 1):
    ws.cell(row=row + 1, column=1, value=total_list[row - 1])

# 设置字号及对齐
font_set = Font(name='Arial', size=9)
for i in range(1, ws.max_row + 1):
    ws.cell(row=i, column=1).font = font_set
    ws.cell(row=i, column=1).alignment = Alignment(horizontal='left', vertical='center', shrink_to_fit=True)

wb.save(os.getcwd() + "\\ID.xlsx")

print(f"\n共获取到 {len(pathss)} 个 Excel表,共 {len(total_list)} 个ID。")

python为每个学生出不一样的题

实现代码:

import random


# 不重复随机整数生成函数
def Random_num(num_max, num_qty):
    '''
    num_max:最大数
    num_qty:生成随机数的个数
    '''
    num_list = []  # 储存生成的随机数
    while len(num_list) < num_qty:  # 控制随机数的个数
        num = random.randint(2, num_max)  # 设定在此范围内取数
        if num in num_list:  # 判断随机数是否重复
            continue  # 若重复,则重新生成
        else:
            num_list.append(num)  # 将不重复的随机数放入列表
    return num_list  # 生成完成后返回随机数列表


# 定义函数,按随机数在题库中抽取对应编号的题目
from openpyxl import load_workbook


def Question(que_type, numbers):
    '''
    que_type:试题类型("单选题","多选题","判断题","填空题")
    numbers:需要抽取的试题编号
    '''
    questions = []  # 储存抽取的题目
    wb = load_workbook("题库.xlsx")  # 载入题库
    if que_type == "单选题":
        ws = wb[que_type]
        for i in numbers:  # 按随机生成的编号抽题
            question = ws["B" + str(i)].value  # 问题在B列
            answerA = "A:\t" + str(ws["C" + str(i)].value)  # 选项A在C列,"\t"相当于按一下tab键,在字符间产生间隔
            answerB = "B:\t" + str(ws["D" + str(i)].value)  # 选项B在D列
            answerC = "C:\t" + str(ws["E" + str(i)].value)  # 选项C在E列
            answerD = "D:\t" + str(ws["F" + str(i)].value)  # 选项D在F列
            right_answer = ws["G" + str(i)].value  # 正确答案在G列
            single_question = [question, answerA, answerB, answerC, answerD, right_answer]  # 每行的数据存入列表
            questions.append(single_question)  # 每个题目的数据存入总列表
    elif que_type == "多选题":
        ws = wb[que_type]
        for i in numbers:
            question = ws["B" + str(i)].value
            answerA = "A:\t" + str(ws["C" + str(i)].value)
            answerB = "B:\t" + str(ws["D" + str(i)].value)
            answerC = "C:\t" + str(ws["E" + str(i)].value)
            answerD = "D:\t" + str(ws["F" + str(i)].value)
            right_answer = ws["H" + str(i)].value
            single_question = [question, answerA, answerB, answerC, answerD, right_answer]
            if ws["G" + str(i)].value:  # 有些题有E选项,有些没有,因此需要判断一下是否有E选项
                answerE = "E:\t" + str(ws["G" + str(i)].value)
                single_question.insert(-1, answerE)  # 将E选项插入到答案前面,保持答案是最后一个元素
            questions.append(single_question)
    else:  # 判断题和填空题,内容只取题干和答案
        ws = wb[que_type]
        for i in numbers:
            question = ws["B" + str(i)].value
            right_answer = ws["C" + str(i)].value
            single_question = [question, right_answer]
            questions.append(single_question)

    return questions


# 写入考试题到word文件
from docx import Document
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体


def To_word(number, questions_data):
    doc = Document("试题-模板.docx")

    # 写入单选题
    title1 = "一、单项选择题(共40题,每题1分)"
    p = doc.add_paragraph()  # 插入段落
    r = p.add_run(title1)  # 插入文字块
    r.bold = True  # 字体加粗
    r.font.size = Pt(12)  # 字号设为12磅
    for index, i in enumerate(questions_data["单选题"], start=1):  # 给题目从1开始编号
        doc.add_paragraph(f"{index}. {i[0]}")  # 题干部分在单独一段
        doc.add_paragraph(f"\t{i[1]}\t\t{i[2]}")  # 选项A和选项B在同一段落
        doc.add_paragraph(f"\t{i[3]}\t\t{i[4]}")  # 选项C和选项D在同一段落

    # 写入多选题
    title2 = "二、多项选择题(共20题,每题2分)"
    p = doc.add_paragraph()
    r = p.add_run(title2)
    r.bold = True
    r.font.size = Pt(12)
    for index, i in enumerate(questions_data["多选题"], start=1):
        doc.add_paragraph(f"{index}. {i[0]}")
        doc.add_paragraph(f"\t{i[1]}\t\t{i[2]}")
        doc.add_paragraph(f"\t{i[3]}\t\t{i[4]}")
        if len(i) == 7:  # 判断是否有E选项,若有,则新建一段落写入
            doc.add_paragraph(f"\t{i[5]}")

    # 写入判断题
    title3 = "三、判断题(共10题,每题1分)"
    p = doc.add_paragraph()
    r = p.add_run(title3)
    r.bold = True
    r.font.size = Pt(12)
    for index, i in enumerate(questions_data["判断题"], start=1):
        doc.add_paragraph(f"\t{index}. {i[0]}")

    # 写入填空题
    title4 = "四、填空题(共10题,每题1分)"
    p = doc.add_paragraph()
    r = p.add_run(title4)
    r.bold = True
    r.font.size = Pt(12)
    for index, i in enumerate(questions_data["填空题"], start=1):
        doc.add_paragraph(f"\t{index}. {i[0]}")

    doc.save(f"试卷及答案\\考试题{number}.docx")


# 写入答案
from docx import Document
from docx.shared import Pt  # 用于设定字体大小(磅值)
from docx.oxml.ns import qn  # 用于应用中文字体


def Answer(number, questions_data):
    doc = Document()
    # 全局字体设为“宋体”
    doc.styles['Normal'].font.name = u'宋体'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

    title = "计算机系2020第二学期期末考试题(答案)"
    p = doc.add_paragraph()
    r = p.add_run(title)
    r.bold = True
    r.font.size = Pt(20)
    # 写入单选题答案
    title1 = "一、单项选择题答案(共40题,每题1分)"
    p = doc.add_paragraph()
    r = p.add_run(title1)
    r.bold = True
    r.font.size = Pt(12)

    p = doc.add_paragraph()
    for index, i in enumerate(questions_data["单选题"], start=1):
        p.add_run(f"{index}. {i[-1]}\t")
        if index % 10 == 0:  # 每段只显示10个答案
            p = doc.add_paragraph()  # 满10个,则新建段落

    # 写入多选题答案
    title2 = "二、多项选择题答案(共20题,每题2分)"
    p = doc.add_paragraph()
    r = p.add_run(title2)
    r.bold = True
    r.font.size = Pt(12)
    p = doc.add_paragraph()
    for index, i in enumerate(questions_data["多选题"], start=1):
        p.add_run(f"{index}. {i[-1]}\t")
        if index % 3 == 0:
            p = doc.add_paragraph()

            # 写入判断题答案
    title3 = "三、判断题答案(共10题,每题1分)"
    p = doc.add_paragraph()
    r = p.add_run(title3)
    r.bold = True
    r.font.size = Pt(12)
    p = doc.add_paragraph()
    for index, i in enumerate(questions_data["判断题"], start=1):
        p.add_run(f"{index}. {i[-1]}\t")
        if index % 5 == 0:  # 每段只显示5个答案
            p = doc.add_paragraph()  # 满5个,则新建段落

    # 写入填空题
    title4 = "四、填空题答案(共10题,每题1分)"
    p = doc.add_paragraph()
    r = p.add_run(title4)
    r.bold = True
    r.font.size = Pt(12)
    p = doc.add_paragraph()
    for index, i in enumerate(questions_data["填空题"], start=1):
        p.add_run(f"{index}. {i[-1]}\t\t")
        if index % 2 == 0:  # 每段只显示2个答案
            p = doc.add_paragraph()  # 满2个,则新建段落

    doc.save(f"试卷及答案\\考试题{number}答案.docx")


# 主函数
for number in range(1, 21):  # 不同的试卷数量,此处为20套
    # 生成随机题目编号
    num_single_choice = Random_num(566, 40)
    num_mult_choice = Random_num(196, 20)
    num_judgment = Random_num(418, 10)
    num_completion = Random_num(190, 10)
    # 将生成的编号存入字典`question_num`
    question_num = {"单选题号": num_single_choice,
                    "多选题号": num_mult_choice,
                    "判断题号": num_judgment,
                    "填空题号": num_completion
                    }
    # 根据随机生成的题目编号去题库选题,并存入`questions_data`
    questions_data = {
        "单选题": Question("单选题", question_num["单选题号"]),
        "多选题": Question("多选题", question_num["多选题号"]),
        "判断题": Question("判断题", question_num["判断题号"]),
        "填空题": Question("填空题", question_num["填空题号"])
    }
    # 将试题写入word文档,并保存
    To_word(number, questions_data)
    # 将试题答案写入word文档,并保存
    Answer(number, questions_data)
    print(f"试卷{number}及答案完成!")

试题-模板.docx
题库.xlsx

定义打印函数,以便重复调用

实现代码:

import win32api


def Print(fileName):
    win32api.ShellExecute(
        0,  # 指定父窗口句柄,搞不懂
        "print",  # 指定操作,这里的"print"表示启动打印应用程序
        fileName,  # 要打印的文件名
        None,  # 打印机设置,若是"None",则使用windows设置的默认打印机
        ".",  # 指定默认目录,照抄的,搞不懂
        0  # 若fileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0
    )


# 获取待打印文件的路径
import os

path = '文件'  # 文件所在文件夹
files = [path + "\\" + i for i in os.listdir(path)]  # 获取文件夹下的文件名,并拼接完整路径

# 批量打印
for file in files:
    Print(file)

从原Excel表中抽出数据存入同一文件的新的Sheet

实现代码:

import pandas as pd

df = pd.read_excel("物料表.xlsx", header=2)
df.head()
#     请求单号     单位     物料编号     架位     批号     数量     日期
# 0     A19X9239156     EA     11010XR0073700     LC000001     PC00001     3     2019-01-03
# 1     A19X9239156     EA     11020XR0025500     LC000002     PC00002     10     2019-01-03
# 2     A19X9239156     EA     11030XR0013200     LC000003     PC00003     3     2019-01-03
# 3     A19X9239156     EA     11140XR0000100     LC000004     PC00004     3     2019-01-03
# 4     A19X9239156     EA     12121XR0172300     LC000005     PC00005     3     2019-01-03

df['月份'] = df['日期'].dt.month
df.head()
#     请求单号     单位     物料编号     架位     批号     数量     日期     月份
# 0     A19X9239156     EA     11010XR0073700     LC000001     PC00001     3     2019-01-03     1
# 1     A19X9239156     EA     11020XR0025500     LC000002     PC00002     10     2019-01-03     1
# 2     A19X9239156     EA     11030XR0013200     LC000003     PC00003     3     2019-01-03     1
# 3     A19X9239156     EA     11140XR0000100     LC000004     PC00004     3     2019-01-03     1
# 4     A19X9239156     EA     12121XR0172300     LC000005     PC00005     3     2019-01-03     1

df5 = df[df['月份'] == 5]
df5.head()
#     请求单号     单位     物料编号     架位     批号     数量     日期     月份
# 9649     A19X9280200     EA     36012XR0413200     LC009650     PC09650     66     2019-05-03     5
# 9650     A19X9280200     EA     60022XR2298300     LC009651     PC09651     66     2019-05-03     5
# 9651     A19X9280561     EA     72004XR2000001     LC009652     PC09652     604     2019-05-03     5
# 9652     A19X9286759     EA     62010XR0161048     LC009653     PC09653     50     2019-05-03     5
# 9653     A19X9286759     EA     62010XR0502208     LC009654     PC09654     100     2019-05-03     5

df8 = df[df['月份'] == 8]
df8.head()


#     请求单号     单位     物料编号     架位     批号     数量     日期     月份
# 17213     A19X9317364     EA     62010XR0500126     LC017214     PC17214     230     2019-08-01     8
# 17214     A19X9317364     EA     61010XR1120100     LC017215     PC17215     230     2019-08-01     8
# 17215     A19X9317364     EA     62012XR0102262     LC017216     PC17216     230     2019-08-01     8
# 17216     A19X9317364     EA     62010XR050150A     LC017217     PC17217     950     2019-08-01     8
# 17217     A19X9317364     EA     61011XR1150500     LC017218     PC17218     230     2019-08-01     8


# 去掉不需要的月份的数据
def Remove_data(df, month=[]):
    for i in month:
        df = df[df['月份'] != i]
    return df


df_rest = Remove_data(df, [5, 8])
df_rest.head()
#     请求单号     单位     物料编号     架位     批号     数量     日期     月份
# 0     A19X9239156     EA     11010XR0073700     LC000001     PC00001     3     2019-01-03     1
# 1     A19X9239156     EA     11020XR0025500     LC000002     PC00002     10     2019-01-03     1
# 2     A19X9239156     EA     11030XR0013200     LC000003     PC00003     3     2019-01-03     1
# 3     A19X9239156     EA     11140XR0000100     LC000004     PC00004     3     2019-01-03     1
# 4     A19X9239156     EA     12121XR0172300     LC000005     PC00005     3     2019-01-03     1

with pd.ExcelWriter('物料表_1.xlsx', engine='openpyxl',
                    datetime_format='YYYY-MM-DD') as writer:
    df5.drop('月份', axis=1).to_excel(writer, sheet_name='5月', index=False)
    df8.drop('月份', axis=1).to_excel(writer, sheet_name='8月', index=False)
    df_rest.drop('月份', axis=1).to_excel(writer, sheet_name='剩余月份', index=False)

from openpyxl import load_workbook
from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment

thin = Side(border_style="thin", color="000000")  # 定义边框粗细及颜色
wb = load_workbook("物料表_1.xlsx")
for sheetname in wb.sheetnames:
    ws = wb[sheetname]

    # 调整列宽
    ws.column_dimensions['A'].width = 12
    ws.column_dimensions['C'].width = 15.5
    ws.column_dimensions['G'].width = 10

    # 设置字号,对齐,缩小字体填充,加边框
    for row_number in range(2, ws.max_row + 1):
        for col_number in range(1, ws.max_column + 1):
            c = ws.cell(row=row_number, column=col_number)
            c.font = Font(size=10)
            c.border = Border(top=thin, left=thin, right=thin, bottom=thin)
            c.alignment = Alignment(horizontal="left", vertical="center")
wb.save("物料表_1.xlsx")

物料表.xlsx