文件名相同指的是主文件名相同,不包括扩展名
| 输入文件 | 主文件名(stem) | 输出文件 | 判断结果 |
|---|---|---|---|
paper.pdf |
paper |
paper.md |
相同 |
paper.docx |
paper |
paper.md |
相同 |
document.pdf |
document |
document.md |
相同 |
thesis.pdf |
thesis |
thesis.md |
相同 |
thesis.docx |
thesis |
thesis.md |
相同 |
关键: paper.pdf 和 paper.docx 会输出到同一个 paper.md,因为它们的主文件名相同。
from pathlib import Path
input_file = Path('/home/fred/Documents/papers/-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005.pdf')
stem = input_file.stem # 不带扩展名的文件名
# 结果: '-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005'def get_output_path(input_file: Path, input_dir: Path, output_dir: Path) -> Path:
return output_dir / f"{input_file.stem}.md"示例:
input_file = Path('/home/fred/Documents/参考文献/arXiv_45000/pdfs/arxiv/-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005.pdf')
output_dir = Path('/home/fred/Documents/参考文献/arXiv_45000/markdown')
out_path = get_output_path(input_file, input_dir, output_dir)
# 结果: '/home/fred/Documents/参考文献/arXiv_45000/markdown/-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005.md'if out_path.exists():
# 输出文件已存在,根据策略决定是否跳过
if existing_files == "skip":
print("Skipping (already exists)")
continue输入目录:
├── paper.pdf
└── paper.docx
输出目录(已有):
└── paper.md
处理逻辑:
- 检查
paper.pdf→ 输出paper.md→ 发现已存在 - 根据策略决定跳过/覆盖/更新
- 检查
paper.docx→ 输出paper.md→ 发现已存在 - 再次根据策略决定
输入目录:
├── chapter1/
│ ├── intro.pdf
│ └── background.pdf
└── chapter2/
└── method.pdf
输出目录:
├── chapter1_md/
│ ├── intro.md
│ └── background.md
└── chapter2_md/
└── method.md
递归模式:
get_output_path(input_file, input_dir, output_dir, recursive=True)
# chapter1/intro.pdf -> chapter1_md/intro.md
# chapter2/method.pdf -> chapter2_md/method.mdfile = Path('/path/to/paper.pdf')
file.name # 'paper.pdf' - 完整文件名
file.stem # 'paper' - 主文件名(无扩展名)
file.suffix # '.pdf' - 扩展名(包含点)file = Path('/path/to/paper.v2.final.pdf')
file.stem # 'paper.v2.final' - 主文件名
file.suffix # '.pdf' - 最后一个扩展名file = Path('/path/to/README')
file.stem # 'README'
file.suffix # ''from nuoyi.utils import get_output_path
from pathlib import Path
input_dir = Path('/input')
output_dir = Path('/output')
pdf = input_dir / 'thesis.pdf'
docx = input_dir / 'thesis.docx'
pdf_out = get_output_path(pdf, input_dir, output_dir)
docx_out = get_output_path(docx, input_dir, output_dir)
assert pdf_out == docx_out # 相同!
assert pdf_out.name == 'thesis.md'pdf1 = input_dir / 'paper1.pdf'
pdf2 = input_dir / 'paper2.pdf'
out1 = get_output_path(pdf1, input_dir, output_dir)
out2 = get_output_path(pdf2, input_dir, output_dir)
assert out1 != out2 # 不同
assert out1.name == 'paper1.md'
assert out2.name == 'paper2.md'pdf = input_dir / '-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005.pdf'
out = get_output_path(pdf, input_dir, output_dir)
assert out.name == '-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005.md'nuoyi ./documents --batch --existing-files skip效果:
paper.pdf→paper.md(如果已存在则跳过)paper.docx→paper.md(会覆盖或跳过,取决于哪个先处理)
建议: 如果PDF和DOCX内容相同,建议只用一个格式,或分别处理到不同目录。
# 只处理PDF
nuoyi ./pdfs --batch --output ./markdown_pdf
# 只处理DOCX
nuoyi ./docxs --batch --output ./markdown_docxnuoyi ./papers --batch --recursive --existing-files update- get_output_path函数:
src/nuoyi/utils.py:1384 - 文件存在检测:
src/nuoyi/api.py:325 - 跳过/覆盖/更新逻辑:
src/nuoyi/api.py:326-402
✅ 已正确实现:
- 文件名相同 = 主文件名相同(不包括扩展名)
paper.pdf和paper.docx都输出到paper.md- 使用
Path.stem获取主文件名 - 检测逻辑在转换前执行,避免浪费
✅ 符合预期:
-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005.pdf→-Qing_2002_Hawking_Radiation_of_arXiv-gr-qc-0204005.md- 支持
--existing-files skip/update/overwrite/ask参数 - GUI和CLI都支持此功能