前言:
之前看小说发现有些小说不能下载,只能在线看,然后想办法用爬虫将正本小说爬下来,但是爬下来的小说一个章节就成了一个文件,如下:
然后我就想把他们整合成一个文件,这样也好导入其他app进行阅读,所以就又开始捣鼓
代码:
注:上面代码做了一些简单的注释,应该都能看懂,注意目录就自己填自己的路径
import os
import re
def extract_chapter_number(filename):
"""
从文件名中提取章节编号,并将大写数字转换为阿拉伯数字。
参数:
filename (str): 文件名。
返回:
int: 章节编号。
"""
match = re.search(r'第([^章]+)章', filename, re.IGNORECASE)
if match:
chapter_str = match.group(1).strip()
return chinese_to_arabic(chapter_str)
return float('inf') # 如果没有找到章节号,默认为无穷大,保证排序在最后
def chinese_to_arabic(chinese_num):
"""
将中文大写数字转换为阿拉伯数字。
参数:
chinese_num (str): 中文大写数字字符串。
返回:
int: 阿拉伯数字。
"""
num_map = {
'零': 0, '一': 1, '二': 2, '三': 3, '四': 4,
'五': 5, '六': 6, '七': 7, '八': 8, '九': 9,
'十': 10, '百': 100, '千': 1000, '万': 10000
}
unit_map = {'十': 10, '百': 100, '千': 1000, '万': 10000}
arabic_num = 0
unit = 1
prev_unit = 0
for char in reversed(chinese_num):
if char in num_map:
num = num_map[char]
if num >= 10 and unit <= num:
unit = num
else:
arabic_num += num * unit
prev_unit = unit
elif char in unit_map:
unit = unit_map[char]
if unit > prev_unit:
arabic_num -= prev_unit
arabic_num += unit
else:
arabic_num += unit
prev_unit = unit
else:
raise ValueError(f"无法识别的字符: {char}")
return arabic_num
def merge_txt_files(directory, output_file):
"""
合并指定文件夹内的所有 .txt 文件到一个新的 .txt 文件中,并记录每个文件的名称。
按照文件名中的章节编号排序合并。章节号改为大写并顶格显示,文章内容缩进两格。
参数:
directory (str): 包含 .txt 文件的文件夹路径。
output_file (str): 新的 .txt 文件的路径。
"""
# 检查目录是否存在
if not os.path.isdir(directory):
print(f"错误:指定的路径 '{directory}' 不是一个有效的目录。")
return
# 获取目录中所有 .txt 文件的列表,并按文件名中的章节编号排序
txt_files = [f for f in os.listdir(directory) if f.endswith('.txt')]
txt_files.sort(key=extract_chapter_number)
# 打开输出文件,如果文件存在则清空内容
with open(output_file, 'w', encoding='utf-8') as outfile:
# 遍历排序后的文件列表
for filename in txt_files:
filepath = os.path.join(directory, filename)
try:
# 提取章节编号并转换为大写
chapter_number = extract_chapter_number(filename)
chapter_number_str = f"第{chapter_number}章".upper()
# 读取文件内容并追加到输出文件
with open(filepath, 'r', encoding='utf-8') as infile:
# 记录文件名(去除后缀)
base_name = os.path.splitext(filename)[0]
outfile.write(f"\n{base_name}\n")
content = infile.read()
# 缩进文章内容两格
indented_content = "\n".join(" " + line for line in content.splitlines())
outfile.write(indented_content)
outfile.write(f"\n--- 本章节完---\n\n") # 分隔符,标识文件结束
except Exception as e:
print(f"处理文件 {filename} 时出错:{e}")
if __name__ == "__main__":
# 指定包含 .txt 文件的文件夹路径
directory = r"D:\Users\Desktop\个人文档\Python学习\下载内容\叶凌天"
# 动态生成输出文件的名称,并加上书名号
output_directory = os.path.dirname(directory)
output_filename = f"《{os.path.basename(directory)}》.txt"
output_file = os.path.join(output_directory, output_filename)
merge_txt_files(directory, output_file)
print(f"合并完成,所有 .txt 文件已合并到 {output_file}")
各位大神轻点喷,以前没有接触过python,觉得python还挺有意思,所以没事自己捣鼓一下,算是一边学习一边记录,希望能和各位大神相互交流学习