在申请软著时需要提供自己编写程序的源代码。根据官方要求:
源代码文档不应少于60页,前30页和后30页的代码应连续,每页50行。代码中不应有空行和大段注释。
那意思就是可以包含简单注释,而且还是单行注释。我们在写软件时可能会把注释同代码写在一行中,那可以通过脚本快速处理并完成源代码格式要求。
主要功能还是基于正则,例如,
将非独立一行的注释转移到新的一行:content = re.sub(r'(?<!\n)(#[^\n]*)', '\n<1>', content)
清除/替换URL:content = re.sub(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', 'URL_PLACEHOLDER', content)
特殊情况下,清除单行或多行注释:content = re.sub(r"(#[^\n]*)|(\'\'\'.*?\'\'\')|(\"\"\".*?\"\"\")", '', content, flags=re.DOTALL)
来看看完整代码:
# 本文件用于合并软著代码
import re
import os
# 记得用 r"" 包括路径
files_list = [
r"server\main.py",
]
# 主要逻辑: 读取文件清除代码注释,清除空白行,最后合并文件内容
files_suffix = ["py", "js"] # 需要合并的文件后缀
pass_files = ["config.toml", "requirements.txt", "README.md", "LICENSE", "index.html"] # 不需要合并的文件
pass_path = [".venv"] # 无需扫描的文件夹
if not any(files_list):
print("未自定义文件列表,开始自动搜索")
for root, dirs, files in os.walk("."):
if any([pass_dir in root for pass_dir in pass_path]):
continue
for file in files:
if file.endswith(tuple(files_suffix)) and file not in pass_files:
files_list.append(os.path.join(root, file))
print(f"共找到 {len(files_list)} 个文件")
exit()
contents = ""
for file in files_list:
with open(file, "r", encoding="utf-8") as f:
content = f.read()
# 将非独立一行的注释转移到新的一行
content = re.sub(r'(?<!\n)(#[^\n]*)', '\n<1>', content)
# 清除URL
content = re.sub(
r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', 'URL_PLACEHOLDER', content)
# 清除注释
# content = re.sub(r"(#[^\n]*)|(\'\'\'.*?\'\'\')|(\"\"\".*?\"\"\")", '', content, flags=re.DOTALL) # 清除单行和多行注释
print(f"文件 {file} 合并成功,共 {len(content)} 字符")
contents += content
# 清除空白行
content = re.sub(r'\n\s*\n', '\n', contents)
if os.path.exists("code.txt"):
os.remove("code.txt")
with open("code.txt", "w", encoding="utf-8") as f:
f.write(content) # 将合并后的内容写入文件
lines = content.split("\n")
print(f"总共有 {len("".join(lines))} 字,有 {len(lines)} 行,可写 {len(lines)/50} 页")
可以看到代码开头,files_list
由你自己定义要合并的代码。如果 files_list
为空,就会以脚本为根遍历同级和下级后缀属于 files_suffix
内的所有文件。此外可以通过 pass_path
跳过不想扫描的文件夹。脚本运行后会在脚本根目录生成 code.txt,随后就可以粘贴至源代码中了。
在此提供一个模板,直接粘贴代码即可,记得修改页头和文件名称。

发表回复