背景需求:
开学了进入新版,照例和同事交换“班级备课资料”,有出有进。
自从学了Python,我对文本资料的格式统一格外关注。8月底就把原始资料进行整理。
通常学期结束的格式清单是这样的。
我自己做的班级资料都写上“序号(补0)”这样就完全按照指定顺序打印资料,看的清晰。
新学期照例问前任小班老师要一套文本类资料。
因为每位老师的资料整理习惯不同,这份资料看上去很乱(文件名不统一,有的名字在前面,有的在后面,有的有日期,有的没有日期,有班级和无班级。)
所以我准备把这套资料也变成序号模式。
一、制作新文件名:提取有序号版本的文件名名称,并把班级、教师姓名,日期进行字母替换。
'''
提取正确的期末资料格式顺序的文件名文字
Deepseek,阿夏
20250827
'''
import os
# 读取目录下所有文件和文件夹名称
def list_files_in_directory(directory_path):
try:
files = os.listdir(directory_path)
return files
except FileNotFoundError:
print(f"错误:目录 '{directory_path}' 不存在")
return []
except PermissionError:
print(f"错误:没有权限访问目录 '{directory_path}'")
return []
# 使用示例
directory = r'C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料(样式)202409-202506 中2下学期班级资料(1)(周明月)202409-202506 中2下学期班级资料2下学期202502-2025063期末资料2期末资料'
file_names = list_files_in_directory(directory)
if not file_names:
print("没有找到文件或目录不存在")
else:
print("原始文件列表:")
print(file_names)
print("
" + "="*50 + "
")
# 进行替换操作
classroom = "中(2)班"
T1 = "夏XX"
T2 = "辛X"
# 使用列表推导式进行替换(简洁高效)
processed_names = [
filename.replace(classroom, '{classroom}')
.replace(T1, '{T1}')
.replace(T2, '{T2}')
for filename in file_names
]
# 输出处理后的结果(列表格式)
print("处理后的文件名称列表:")
print("[")
for filename in processed_names:
print(f" f'{filename}',")
print("]")
# 保存到新的列表变量
new_name_list = processed_names.copy()
# [
# f'01 {classroom}班级计划(2025.2)完.docx',
# f'02 {classroom}班级小结(2025.6).docx',
# f'03 {classroom}幼儿行为观察评价表-{T1}(完).docx',
# f'03 {classroom}幼儿行为观察评价表-{T2}(完).docx',
# f'04 {classroom}下学期周计划教案',
# f'05 {classroom}专题小结(完).docx',
# f'06 {classroom}游戏活动观察与记录-{T1}(完).docx',
# f'06 {classroom}游戏活动观察与记录-{T2}(完).docx',
# f'07 {classroom}自主游戏小结(2025.6).docx',
# f'08 {classroom}保教反思案例-{T1}.docx',
# f'08 {classroom}保教反思案例-{T2}.docx',
# f'10 {classroom}教养笔记-{T1}(2025.6)(完).docx',
# f'10 {classroom}教养笔记-{T2}(2025.6)完.docx',
# f'11 中(2)(下)个别化学习操作材料汇总表1 完 .doc',
# f'~$ {classroom}班级小结(2025.1).docx',
# f'【2025】档案资料移交清单(教研组)(2024调整版).xls',
# f'{classroom}班级计划.docx',
# f'幼儿行为观察评价表(6个空表).docx',
# f'教养笔记关键词.txt',
# f'游戏案例的AI关键词 (2).txt',
# ]
需要的的样式,序号,班级,文件内容(教师名字),日期.docx
提炼和替换后,字母的“班级、姓名”变成可替换。
列表里,有序号的文件排在前面,没有需要的文件名名称改在后面
把这个列表复制出来,保留有序号的。再手动修改日期模版data1=9月,date2=1月,()用来完成后写“完”
这就是需要替换的新名字。
二、处理提供的资料。
1.doc转docx——以前的资料都是doc,现在吸光用docx。这份里面有10个doc
'''
参考资料的word格式改成docx,删除doc
Deepseek,阿夏
20250827
'''
import os
import sys
import tempfile
from pathlib import Path
import pythoncom
from win32com import client as wc
def ensure_docx_extension(filename):
"""确保文件有正确的.docx扩展名"""
filename_str = str(filename)
if filename_str.lower().endswith('.doc'):
return filename_str[:-4] + '.docx'
elif not filename_str.lower().endswith('.docx'):
return filename_str + '.docx'
return filename_str
def convert_doc_to_docx(doc_path, docx_path):
"""使用COM接口将DOC文件转换为DOCX"""
try:
# 初始化COM
pythoncom.CoInitialize()
# 创建Word应用程序对象
word = wc.Dispatch("Word.Application")
word.Visible = False
word.DisplayAlerts = False
# 打开DOC文档
doc = word.Documents.Open(str(doc_path))
# 确保目标路径有正确的扩展名
docx_path = ensure_docx_extension(docx_path)
# 保存为DOCX格式
doc.SaveAs2(str(docx_path), FileFormat=16) # 16代表docx格式
# 关闭文档和Word应用
doc.Close()
word.Quit()
# 释放COM资源
pythoncom.CoUninitialize()
return True, f"成功转换: {doc_path.name} -> {Path(docx_path).name}"
except Exception as e:
return False, f"转换失败 {doc_path.name}: {str(e)}"
def main():
# 设置文件夹路径
folder_path = r'C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料1 202509小2班上学期资料3期末资料'
# 检查文件夹是否存在
if not os.path.exists(folder_path):
print(f"错误:文件夹 '{folder_path}' 不存在")
return
# 获取文件夹中的所有文件
all_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
file_lower = file.lower()
if file_lower.endswith('.doc') or file_lower.endswith('.docx'):
all_files.append(Path(root) / file)
if not all_files:
print("在指定文件夹中没有找到DOC或DOCX文件")
return
print(f"找到 {len(all_files)} 个Word文档文件")
print("开始转换...")
print("-" * 50)
# 转换统计
success_count = 0
fail_count = 0
skip_count = 0
# 处理每个文件
for file_path in all_files:
file_ext = file_path.suffix.lower()
if file_ext == '.docx':
# 已经是DOCX格式,跳过
print(f"跳过(已是DOCX格式): {file_path.name}")
skip_count += 1
continue
if file_ext != '.doc':
# 不是DOC文件,跳过
print(f"跳过(不是DOC文件): {file_path.name}")
skip_count += 1
continue
# 构建输出路径(与输入文件相同目录)
output_path = file_path.parent / file_path.stem
# 执行转换
success, message = convert_doc_to_docx(file_path, output_path)
if success:
# 删除原始DOC文件
try:
os.remove(file_path)
message += " (已删除原DOC文件)"
except Exception as e:
message += f" (但删除原文件失败: {str(e)})"
success_count += 1
else:
fail_count += 1
print(message)
# 输出统计结果
print("-" * 50)
print("转换完成!")
print(f"成功: {success_count}, 失败: {fail_count}, 跳过: {skip_count}")
if __name__ == "__main__":
# 检查是否在Windows系统上运行
if sys.platform != "win32":
print("错误:此程序需要在Windows系统上运行")
sys.exit(1)
# 检查必要的库是否已安装
try:
from win32com import client
import pythoncom
except ImportError as e:
print(f"错误:缺少必要的库,请安装: {e}")
print("请运行: pip install pywin32")
sys.exit(1)
main()
10个doc都转成docx了
docx文件没有排序,需要核对左侧的内容,手动给右侧添加01、02、03
有些表格上学期已经不用了,但为了防止“几年后又要用”,这些模版还是留着。序号靠后。
三、替换docx文件名名称
'''
参考资料的docx按顺序替换文件名。变成有01.02、03的规范的样式(预览)
Deepseek,阿夏
20250827
'''
import os
from pathlib import Path
# 定义模板名称列表(根据实际情况修改这些变量)
classroom = "小1班" # 班级名称
date1 = "2025.9" # 日期1
date2 = "2026.1" # 日期2
T1 = "张老师" # 教师1
T2 = "李老师" # 教师2
# 模板名称列表
name_templates = [
f'01_{classroom}_班级计划_{date1}_().docx',
f'02_{classroom}_班级小结_{date2}_().docx',
f'03 {classroom} 幼儿行为观察评价表-{T1}_{date2}_().docx',
f'03 {classroom} 幼儿行为观察评价表-{T2}_{date2}_().docx',
f'04 {classroom} 下学期周计划教案(文件夹).docx',
f'05 {classroom} 专题小结_{date2}_().docx',
f'06 {classroom} 游戏活动观察与记录_{T1}_{date2}_().docx',
f'06 {classroom} 游戏活动观察与记录-{T2}_{date2}_().docx',
f'07 {classroom} 自主游戏小结_{date2}_().docx',
f'08 {classroom} 保教反思案例-{T1}_{date2}_().docx',
f'08 {classroom} 保教反思案例-{T2}_{date2}_().docx',
f'09 {classroom} 教养笔记-{T1}_{date2}_().docx',
f'09 {classroom} 教养笔记-{T2}_{date2}_().docx',
f'10 {classroom}_(备用)个别化学习操作材料汇总表_{date2}_().docx',
f'11 {classroom}_(淘汰)幼儿发展预评估_{date2}_().docx',
f'12 {classroom}_(淘汰)自主游戏观察记录20周{date2}_().docx'
]
def rename_files_by_order(folder_path, templates, dry_run=True):
"""
按照模板列表的顺序批量重命名文件夹中的文件
参数:
folder_path: 文件夹路径
templates: 模板名称列表
dry_run: 是否只是预览而不实际执行重命名
"""
# 检查文件夹是否存在
if not os.path.exists(folder_path):
print(f"错误:文件夹 '{folder_path}' 不存在")
return
# 获取文件夹中的所有docx文件
docx_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.lower().endswith('.docx'):
docx_files.append(Path(root) / file)
if not docx_files:
print("在指定文件夹中没有找到任何docx文件")
return
# 按文件名排序,确保处理顺序一致
docx_files.sort()
print(f"找到 {len(docx_files)} 个docx文件")
print("开始处理文件重命名...")
print("-" * 60)
# 重命名统计
renamed_count = 0
skipped_count = 0
# 检查模板数量是否足够
if len(docx_files) > len(templates):
print(f"警告:文件数量({len(docx_files)})多于模板数量({len(templates)})")
print("多余的文件将不会被重命名")
# 按照顺序处理每个文件
for i, file_path in enumerate(docx_files):
if i >= len(templates):
print(f"跳过(无对应模板): {file_path.name}")
skipped_count += 1
continue
original_name = file_path.name
new_name = templates[i]
# 如果名称没有变化,跳过
if new_name == original_name:
print(f"跳过(名称未变化): {original_name}")
skipped_count += 1
continue
# 构建新路径
new_path = file_path.parent / new_name
# 检查新文件名是否已存在
if new_path.exists():
print(f"跳过(目标文件已存在): {original_name} -> {new_name}")
skipped_count += 1
continue
# 执行重命名或预览
if dry_run:
print(f"[预览] {original_name} -> {new_name}")
renamed_count += 1
else:
try:
os.rename(file_path, new_path)
print(f"重命名成功: {original_name} -> {new_name}")
renamed_count += 1
except Exception as e:
print(f"重命名失败 {original_name}: {str(e)}")
skipped_count += 1
# 输出统计结果
print("-" * 60)
if dry_run:
print("预览完成!")
print(f"可重命名: {renamed_count}, 跳过: {skipped_count}")
print("
注意:这只是预览模式,要实际执行重命名,请设置 dry_run=False")
else:
print("重命名完成!")
print(f"成功重命名: {renamed_count}, 跳过: {skipped_count}")
def main():
# 设置文件夹路径
folder_path = r"C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料1 202509小2班上学期资料3期末资料" # 修改为您的文件夹路径
# 是否只是预览而不实际执行重命名(设置为False以实际执行重命名)
dry_run = True
# 执行顺序重命名
rename_files_by_order(folder_path, name_templates, dry_run)
if __name__ == "__main__":
main()
预览一下,文件名都一一对应更换了(按索引)
实际替换代码
'''
参考资料的docx按顺序替换文件名。变成有01.02、03的规范的样式(实际替换)
Deepseek,阿夏
20250827
'''
import os
from pathlib import Path
# 定义模板名称列表(根据实际情况修改这些变量)
classroom = "小2班" # 班级名称
date1 = "2025.9" # 日期1
date2 = "2026.1" # 日期2
T1 = "张老师" # 教师1(根据实际文件名修正)
T2 = "李老师" # 教师2(根据实际文件名修正)
# 修正后的模板名称列表(使用中文括号和正确的日期格式)
name_templates = [
f'01_{classroom}_班级计划_{date1}().docx',
f'02_{classroom}_班级小结_{date2}().docx',
f'03 {classroom} 幼儿行为观察评价表_{T1}_{date2}().docx',
f'03 {classroom} 幼儿行为观察评价表_{T2}_{date2}().docx',
f'04 {classroom} 下学期周计划教案(文件夹).docx',
f'05 {classroom} 专题小结_{date2}().docx',
f'06 {classroom} 游戏活动观察与记录_{T1}_{date2}().docx',
f'06 {classroom} 游戏活动观察与记录-{T2}_{date2}().docx',
f'07 {classroom} 自主游戏小结_{date2}().docx',
f'08 {classroom} 保教反思案例-{T1}_{date2}().docx',
f'08 {classroom} 保教反思案例-{T2}_{date2}().docx',
f'09 {classroom} 教养笔记-{T1}_{date2}().docx',
f'09 {classroom} 教养笔记-{T2}_{date2}().docx',
f'10 {classroom}_(备用)个别化学习操作材料汇总表_{date2}().docx',
f'11 {classroom}_(淘汰)幼儿发展预评估_{date2}().docx',
f'12 {classroom}_(淘汰)自主游戏观察记录20周{date2}().docx'
]
def rename_files_by_order(folder_path, templates):
"""
按照模板列表的顺序批量重命名文件夹中的文件
参数:
folder_path: 文件夹路径
templates: 模板名称列表
"""
# 检查文件夹是否存在
if not os.path.exists(folder_path):
print(f"错误:文件夹 '{folder_path}' 不存在")
return
# 获取文件夹中的所有docx文件
docx_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.lower().endswith('.docx'):
docx_files.append(Path(root) / file)
if not docx_files:
print("在指定文件夹中没有找到任何docx文件")
return
# 按文件名排序,确保处理顺序一致
docx_files.sort()
print(f"找到 {len(docx_files)} 个docx文件")
print("开始处理文件重命名...")
print("-" * 60)
# 重命名统计
renamed_count = 0
skipped_count = 0
# 检查模板数量是否足够
if len(docx_files) > len(templates):
print(f"警告:文件数量({len(docx_files)})多于模板数量({len(templates)})")
print("多余的文件将不会被重命名")
# 按照顺序处理每个文件
for i, file_path in enumerate(docx_files):
if i >= len(templates):
print(f"跳过(无对应模板): {file_path.name}")
skipped_count += 1
continue
original_name = file_path.name
new_name = templates[i]
# 如果名称没有变化,跳过
if new_name == original_name:
print(f"跳过(名称未变化): {original_name}")
skipped_count += 1
continue
# 构建新路径
new_path = file_path.parent / new_name
# 检查新文件名是否已存在
if new_path.exists():
print(f"跳过(目标文件已存在): {original_name} -> {new_name}")
skipped_count += 1
continue
# 执行重命名
try:
os.rename(file_path, new_path)
print(f"重命名成功: {original_name} -> {new_name}")
renamed_count += 1
except Exception as e:
print(f"重命名失败 {original_name}: {str(e)}")
skipped_count += 1
# 输出统计结果
print("-" * 60)
print("重命名完成!")
print(f"成功重命名: {renamed_count}, 跳过: {skipped_count}")
def main():
# 设置文件夹路径
folder_path = r"C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料1 202509小2班上学期资料3期末资料" # 修改为您的文件夹路径
# 执行顺序重命名
rename_files_by_order(folder_path, name_templates)
if __name__ == "__main__":
main()
格式非常整齐统一。
既然外面的文件名修改了,那么它内部的”年、教师、日期“是不是也可以查找批量修改?
'''
把每个docx里面的年份、班级、教师、日期都改掉(上学期)
Deepseek,阿夏
20250827
'''
import os
import win32com.client as win32
from win32com.client import constants
import re
# 配置参数
o1 = '2024'
o2 = '2025'
y1 = str(int(o1) + 1)
y2 = str(int(o2) + 1)
T1 = '吴XX'
T2 = '周XX'
T3 = '张X'
T4 = '李XX'
g='小'
n1='1'
n2='2'
n3='一'
n4='二'
# 定义替换规则
replacements = [
(f"{o2}.1", f"{y2}.1"), # 具体日期格式
(f"{o1}.9", f"{y1}.9"),
(o2, y2), # 一般年份
(o1, y1),
(f"{g}({n1})班", f"{g}({n2})班"), # 班级格式
(f"{g}({n1})班", f"{g}({n2})班"),
(f"{g}{n3}班", f"{g}{n4}班"),
(f"{g}{n1}班", f"{g}{n2}班"),
(f"{g}({n3})班", f"{g}({n4})班"),
(f"{g}({n3})班", f"{g}({n4})班"),
(T1, T3), # 教师姓名
(T2, T4)
]
def replace_in_all_story_ranges(doc, find_text, replace_text):
"""在文档的所有故事范围(包括页眉、页脚、文本框等)中执行替换,保持格式"""
for story_range in doc.StoryRanges:
while story_range:
try:
# 使用Word内置的查找替换功能,保持格式
story_range.Find.Execute(
FindText=find_text,
ReplaceWith=replace_text,
Replace=constants.wdReplaceAll,
MatchCase=False,
MatchWholeWord=False,
MatchWildcards=False
)
# 处理链接的故事范围(如连续的页眉页脚)
story_range = story_range.NextStoryRange
except Exception as e:
print(f"替换时出错: {e}")
break
def replace_content_comprehensive():
path = r'C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料1 202509小2班上学期资料'
source_folder = path + r"3期末资料"
target_folder = path + r"3期末资料(改信息)"
if not os.path.exists(target_folder):
os.makedirs(target_folder)
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False
word.DisplayAlerts = False
try:
for filename in os.listdir(source_folder):
if filename.endswith('.docx'):
source_file = os.path.join(source_folder, filename)
target_file = os.path.join(target_folder, filename)
print(f"正在处理: {filename}")
doc = word.Documents.Open(source_file)
# 按顺序执行所有替换规则
for find_text, replace_text in replacements:
replace_in_all_story_ranges(doc, find_text, replace_text)
doc.SaveAs(target_file)
doc.Close()
print(f"已完成: {filename}")
except Exception as e:
print(f"错误: {e}")
finally:
word.Quit()
def test_replacements():
"""测试替换规则 - 使用全局的replacements列表"""
print("测试替换规则:")
for find_text, replace_text in replacements:
print(f" {find_text} -> {replace_text}")
if __name__ == "__main__":
# 先显示替换规则
test_replacements()
print("
开始处理文档...")
# 处理文档
replace_content_comprehensive()
print("所有文档处理完成!")
每个文件都打开后,看到班级有不同的表示方法 汉字数字、是否加中英文括号等
还有2025.1月没有改成2026.1月
所以添加替换内容
重新生成后
特别说明:
如果某个年份始终无法+1,请查看原始文档里面的日期是否写错
用同样方法做下学期(部分参数修改)
1、文件放到(原始)里面备份
2、复制一份到(有序号)+doc转docx+手动编号
3、复制有序号的到“期末资料”文件夹,Python更改文件名
4、修改内部内容,转入(改信息)
、
代码优化
我把代码做成可选样式(1=上学期、2=下学期)
先输入1,做上学期
0、资料放在“1原始”,包含docx和doc)
1、上下学期资料从“1原始”里都改成docx,转入‘’2无序号docx”和“3人工输入序号”两个文件夹中。
'''
参考资料的word格式改成docx,保存到两个文件夹内(全部docx,和手动添加序号的文件夹)
Deepseek,阿夏
20250827
'''
import os
import sys
import shutil
from pathlib import Path
import pythoncom
from win32com import client as wc
def ensure_docx_extension(filename):
"""确保文件有正确的.docx扩展名"""
filename_str = str(filename)
if filename_str.lower().endswith('.doc'):
return filename_str[:-4] + '.docx'
elif not filename_str.lower().endswith('.docx'):
return filename_str + '.docx'
return filename_str
def convert_doc_to_docx(doc_path, docx_path):
"""使用COM接口将DOC文件转换为DOCX"""
try:
# 初始化COM
pythoncom.CoInitialize()
# 创建Word应用程序对象
word = wc.Dispatch("Word.Application")
word.Visible = False
word.DisplayAlerts = False
# 打开DOC文档
doc = word.Documents.Open(str(doc_path))
# 确保目标路径有正确的扩展名
docx_path = ensure_docx_extension(docx_path)
# 保存为DOCX格式
doc.SaveAs2(str(docx_path), FileFormat=16) # 16代表docx格式
# 关闭文档和Word应用
doc.Close()
word.Quit()
# 释放COM资源
pythoncom.CoUninitialize()
return True, f"成功转换: {doc_path.name} -> {Path(docx_path).name}"
except Exception as e:
return False, f"转换失败 {doc_path.name}: {str(e)}"
def copy_and_convert_files(source_folder, target_folders):
"""复制并转换文件从源文件夹到多个目标文件夹"""
# 检查源文件夹是否存在
if not os.path.exists(source_folder):
print(f"错误:源文件夹 '{source_folder}' 不存在")
return False, 0, 0, 0
# 确保所有目标文件夹都存在
for target_folder in target_folders:
os.makedirs(target_folder, exist_ok=True)
# 获取源文件夹中的所有文件
all_files = []
for root, dirs, files in os.walk(source_folder):
for file in files:
file_lower = file.lower()
if file_lower.endswith('.doc') or file_lower.endswith('.docx'):
all_files.append(Path(root) / file)
if not all_files:
print("在源文件夹中没有找到DOC或DOCX文件")
return False, 0, 0, 0
print(f"找到 {len(all_files)} 个Word文档文件")
print("开始转换并复制到多个文件夹...")
print("-" * 60)
# 转换统计
success_count = 0
fail_count = 0
skip_count = 0
# 处理每个文件
for file_path in all_files:
file_ext = file_path.suffix.lower()
# 处理每个目标文件夹
for i, target_folder in enumerate(target_folders):
# 构建目标文件路径
relative_path = file_path.relative_to(source_folder)
target_file_path = Path(target_folder) / relative_path
# 确保目标目录存在
os.makedirs(target_file_path.parent, exist_ok=True)
if file_ext == '.docx':
# 已经是DOCX格式,直接复制
try:
shutil.copy2(file_path, target_file_path)
if i == 0: # 只在第一次复制时打印
print(f"复制DOCX文件: {file_path.name}")
success_count += 1 if i == 0 else 0
except Exception as e:
print(f"复制失败 {file_path.name} 到 {target_folder}: {str(e)}")
fail_count += 1 if i == 0 else 0
elif file_ext == '.doc':
# DOC文件需要转换 - 每个文件夹都独立转换
success, message = convert_doc_to_docx(file_path, target_file_path)
if i == 0: # 只在第一次转换时统计和打印
if success:
success_count += 1
else:
fail_count += 1
print(message)
else:
# 其他文件类型,跳过
if i == 0: # 只在第一次处理时打印
print(f"跳过(不是DOC/DOCX文件): {file_path.name}")
skip_count += 1
return True, success_count, fail_count, skip_count
def main():
# 设置文件夹路径
if q == 1:
base_path = r'C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料1 202509小2班上学期资料'
source_folder = os.path.join(base_path, '03期末资料(1原始)')
target_folder1 = os.path.join(base_path, '03期末资料(2无序号docx)')
target_folder2 = os.path.join(base_path, '03期末资料(3人工调整序号)')
else:
base_path = r'C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料2 202602小2班下学期资料'
source_folder = os.path.join(base_path, '03期末资料(1原始)')
target_folder1 = os.path.join(base_path, '03期末资料(2无序号docx)')
target_folder2 = os.path.join(base_path, '03期末资料(3人工调整序号)')
# 目标文件夹列表
target_folders = [target_folder1, target_folder2]
print(f"源文件夹: {source_folder}")
print(f"目标文件夹1(无序号): {target_folder1}")
print(f"目标文件夹2(有序号): {target_folder2}")
print("-" * 60)
# 执行文件复制和转换
success, success_count, fail_count, skip_count = copy_and_convert_files(source_folder, target_folders)
if success:
# 输出统计结果
print("-" * 60)
print("转换完成!")
print(f"成功处理: {success_count} 个文件")
print(f"失败: {fail_count} 个文件")
print(f"跳过: {skip_count} 个文件")
print(f"
文件已保存到以下两个文件夹:")
print(f"1. {target_folder1} - 无序号DOCX文件")
print(f"2. {target_folder2} - 用于人工调整序号")
if __name__ == "__main__":
# 检查是否在Windows系统上运行
q=int(input('1上学期、2下学期(输入1或2)
'))
if sys.platform != "win32":
print("错误:此程序需要在Windows系统上运行")
sys.exit(1)
# 检查必要的库是否已安装
try:
from win32com import client
import pythoncom
except ImportError as e:
print(f"错误:缺少必要的库,请安装: {e}")
print("请运行: pip install pywin32")
sys.exit(1)
main()
全部是的docx,但是没有排序
人工调整文件夹需要,手动修改编号(修改后,最后复制一份)防止再次生成覆盖掉,又要手动填好
因为有手动改编号的内容,非常繁琐,所以最好每个内容都保存在不一样的文件夹内。以免资料遗失。
手动输入编号
复制一份
修改“3人工调整序号”文件夹里文件名。根据索引01配01的新文件名。把新文件放在“4改文件名’
'''
参考资料的docx按顺序替换文件名。变成有01.02、03的规范的样式(实际替换)
Deepseek,阿夏
20250827
'''
'''
参考资料的docx按顺序替换文件名。变成有01.02、03的规范的样式(实际替换)
Deepseek,阿夏
20250827
'''
import os
import shutil
from pathlib import Path
q = int(input('1上学期、2下学期(输入1或2)
'))
# 定义模板名称列表(根据实际情况修改这些变量)
classroom = "小2班" # 班级名称
if q == 1:
date1 = "2025.9" # 日期1
date2 = "2026.1" # 日期2
else:
date1 = "2026.2" # 日期1
date2 = "2026.6" # 日期2
T1 = "教师1姓名" # 教师1(根据实际文件名修正)
T2 = "教师2姓名" # 教师2(根据实际文件名修正)
# 修正后的模板名称列表(使用中文括号和正确的日期格式)
name_templates = [
f'01_{classroom}_班级计划_{date1}().docx',
f'02_{classroom}_班级小结_{date2}().docx',
f'03 {classroom} 幼儿行为观察评价表_{T1}_{date2}().docx',
f'03 {classroom} 幼儿行为观察评价表_{T2}_{date2}().docx',
f'04 {classroom} 下学期周计划教案(文件夹).docx',
f'05 {classroom} 专题小结_{date2}().docx',
f'06 {classroom} 游戏活动观察与记录_{T1}_{date2}().docx',
f'06 {classroom} 游戏活动观察与记录-{T2}_{date2}().docx',
f'07 {classroom} 自主游戏小结_{date2}().docx',
f'08 {classroom} 保教反思案例-{T1}_{date2}().docx',
f'08 {classroom} 保教反思案例-{T2}_{date2}().docx',
f'09 {classroom} 教养笔记-{T1}_{date2}().docx',
f'09 {classroom} 教养笔记-{T2}_{date2}().docx',
f'10 {classroom}_(备用)个别化学习操作材料汇总表_{date2}().docx',
f'11 {classroom}_(淘汰)幼儿发展预评估_{date2}().docx',
f'12 {classroom}_(淘汰)自主游戏观察记录20周{date2}().docx'
]
def copy_files_to_target_folder(source_folder, target_folder):
"""将源文件夹中的文件复制到目标文件夹"""
# 检查源文件夹是否存在
if not os.path.exists(source_folder):
print(f"错误:源文件夹 '{source_folder}' 不存在")
return False
# 确保目标文件夹存在
os.makedirs(target_folder, exist_ok=True)
# 清空目标文件夹(如果已存在)
for file in os.listdir(target_folder):
file_path = os.path.join(target_folder, file)
try:
if os.path.isfile(file_path):
os.unlink(file_path)
except Exception as e:
print(f"删除文件失败 {file_path}: {e}")
# 复制所有docx文件到目标文件夹
docx_files = []
for root, dirs, files in os.walk(source_folder):
for file in files:
if file.lower().endswith('.docx'):
source_path = Path(root) / file
target_path = Path(target_folder) / file
shutil.copy2(source_path, target_path)
docx_files.append(target_path)
print(f"已复制 {len(docx_files)} 个文件到目标文件夹")
return True
def rename_files_by_order(folder_path, templates):
"""
按照模板列表的顺序批量重命名文件夹中的文件
参数:
folder_path: 文件夹路径
templates: 模板名称列表
"""
# 检查文件夹是否存在
if not os.path.exists(folder_path):
print(f"错误:文件夹 '{folder_path}' 不存在")
return
# 获取文件夹中的所有docx文件
docx_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.lower().endswith('.docx'):
docx_files.append(Path(root) / file)
if not docx_files:
print("在指定文件夹中没有找到任何docx文件")
return
# 按文件名排序,确保处理顺序一致
docx_files.sort()
print(f"找到 {len(docx_files)} 个docx文件")
print("开始处理文件重命名...")
print("-" * 60)
# 重命名统计
renamed_count = 0
skipped_count = 0
# 检查模板数量是否足够
if len(docx_files) > len(templates):
print(f"警告:文件数量({len(docx_files)})多于模板数量({len(templates)})")
print("多余的文件将不会被重命名")
# 按照顺序处理每个文件
for i, file_path in enumerate(docx_files):
if i >= len(templates):
print(f"跳过(无对应模板): {file_path.name}")
skipped_count += 1
continue
original_name = file_path.name
new_name = templates[i]
# 如果名称没有变化,跳过
if new_name == original_name:
print(f"跳过(名称未变化): {original_name}")
skipped_count += 1
continue
# 构建新路径
new_path = file_path.parent / new_name
# 检查新文件名是否已存在
if new_path.exists():
print(f"跳过(目标文件已存在): {original_name} -> {new_name}")
skipped_count += 1
continue
# 执行重命名
try:
os.rename(file_path, new_path)
print(f"重命名成功: {original_name} -> {new_name}")
renamed_count += 1
except Exception as e:
print(f"重命名失败 {original_name}: {str(e)}")
skipped_count += 1
# 输出统计结果
print("-" * 60)
print("重命名完成!")
print(f"成功重命名: {renamed_count}, 跳过: {skipped_count}")
def main():
# 设置文件夹路径
if q == 1:
path = r"C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料1 202509小2班上学期资料"
source_folder = path + r"3期末资料(3人工调整序号)"
target_folder = path + r"3期末资料(4改文件名)"
else:
path = r"C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料2 202602小2班下学期资料"
source_folder = path + r"3期末资料(3人工调整序号)"
target_folder = path + r"3期末资料(4改文件名)"
# 确保目标文件夹存在
os.makedirs(target_folder, exist_ok=True)
# 首先将文件从3文件夹复制到4文件夹
print(f"正在从 '{source_folder}' 复制文件到 '{target_folder}'...")
if not copy_files_to_target_folder(source_folder, target_folder):
return
print("-" * 60)
# 然后在4文件夹中执行重命名操作
rename_files_by_order(target_folder, name_templates)
if __name__ == "__main__":
main()
五、文件名都改了,最后就是内部信息更改
'''
把每个docx里面的年份、班级、教师、日期都改掉(上下学期)
Deepseek,阿夏
20250827
'''
import os
import win32com.client as win32
from win32com.client import constants
import re
# 配置参数
o1 = '2024'
o2 = '2025'
y1 = str(int(o1) + 1)
y2 = str(int(o2) + 1)
T1 = '源文件里教师1姓名'
T2 = '源文件里教师2姓名'
T3 = '本班教师1姓名'
T4 = '本班教师2姓名'
g='小'
n1='1'
n2='2'
n3='一'
n4='二'
# 定义替换规则
replacements = [
(f"{o2}.1", f"{y2}.1"), # 具体日期格式
(f"{o1}.9", f"{y1}.9"),
(o2, y2), # 一般年份
(o1, y1),
(f"{g}({n1})班", f"{g}({n2})班"), # 班级格式
(f"{g}({n1})班", f"{g}({n2})班"),
(f"{g}{n3}班", f"{g}{n4}班"),
(f"{g}{n1}班", f"{g}{n2}班"),
(f"{g}({n3})班", f"{g}({n4})班"),
(f"{g}({n3})班", f"{g}({n4})班"),
(T1, T3), # 教师姓名
(T2, T4)
]
def replace_in_all_story_ranges(doc, find_text, replace_text):
"""在文档的所有故事范围(包括页眉、页脚、文本框等)中执行替换,保持格式"""
for story_range in doc.StoryRanges:
while story_range:
try:
# 使用Word内置的查找替换功能,保持格式
story_range.Find.Execute(
FindText=find_text,
ReplaceWith=replace_text,
Replace=constants.wdReplaceAll,
MatchCase=False,
MatchWholeWord=False,
MatchWildcards=False
)
# 处理链接的故事范围(如连续的页眉页脚)
story_range = story_range.NextStoryRange
except Exception as e:
print(f"替换时出错: {e}")
break
def replace_content_comprehensive():
if q==1:
path = r'C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料1 202509小2班上学期资料'
else:
path = r'C:Usersjg2yXRZOneDrive桌面20250901小2班班级资料2 202602小2班下学期资料'
source_folder = path + r"3期末资料(4改文件名)"
target_folder = path + r"3期末资料(5改内部信息)"
if not os.path.exists(target_folder):
os.makedirs(target_folder)
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False
word.DisplayAlerts = False
try:
for filename in os.listdir(source_folder):
if filename.endswith('.docx'):
source_file = os.path.join(source_folder, filename)
target_file = os.path.join(target_folder, filename)
print(f"正在处理: {filename}")
doc = word.Documents.Open(source_file)
# 按顺序执行所有替换规则
for find_text, replace_text in replacements:
replace_in_all_story_ranges(doc, find_text, replace_text)
doc.SaveAs(target_file)
doc.Close()
print(f"已完成: {filename}")
except Exception as e:
print(f"错误: {e}")
finally:
word.Quit()
def test_replacements():
"""测试替换规则 - 使用全局的replacements列表"""
print("测试替换规则:")
for find_text, replace_text in replacements:
print(f" {find_text} -> {replace_text}")
if __name__ == "__main__":
q=int(input('1上学期、2下学期(输入1或2)
'))
# 先显示替换规则
test_replacements()
print("
开始处理文档...")
# 处理文档
replace_content_comprehensive()
print("所有文档处理完成!")
里面的日期,都从2025变2026、2024变2025
可以把资料复制到03期末资料里备用
同样方式做下学期(输入数字2)
把03-5改内部信息里面的docx复制到03期末资料
其他03都删除。
改过基础信息的班级资料就做好了
结语:
总体来说,班级资料的核心内容大同小异,修改里面内容时,就不会出现忘记修改人名、班级、日期的情况了。由于年年有模版格式的调整(专家指导),领导一句话,资料就要批量改死,所以我一直致力研究用编程提高“本文制作”的效率。
开学在即,年年岁岁花相似,岁岁年年人亦同,入职十几年了,早没有职初的新鲜期,也真切感受每一批孩子都有月龄差异、能力差异,兴趣差异、性别差异——常常感叹:这个孩子就是我曾经带过的那个孩子。
而职业最大的愿望依旧是最低的目标——安全平安!因为看护孩子安全就已经耗费了所有的心力,所以一些不那么重要的文本任务跟需要速度和效率去早日完成。把更多时间用在“看孩子安全”和“发现幼儿表现”上,才是一线教师最核心的需求。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...