【发布时间】:2021-01-27 13:55:38
【问题描述】:
我创建了一个脚本,在一个文件夹中查找 pdf 中的单词,然后如果找到它会将 pdf 移动到另一个文件夹。
from pathlib import Path
import PyPDF2
import re
import os
import shutil
pattern = input("Enter string pattern to search: ")
basepath = Path('\hrdinhal\Data\Desktop\Analize\Search engine')
src = basepath / 'Folder 1'
dst = basepath / 'Folder 2'
for file_name in os.scandir(src):
file = PyPDF2.PdfFileReader(str(src / file_name), 'rb')
numPages = file.getNumPages()
for i in range(0, numPages):
pageObj = file.getPage(i)
text = pageObj.extractText()
for match in re.findall(pattern, text, re.IGNORECASE):
shutil.copyfile(str(src / file_name), str(dst / file_name))
当我运行它时,我得到了错误:
SameFileError: '\\hrdinhal\\Data\\Desktop\\Analize\\Search engine\\Folder 1\\Daily Production Summary 1.pdf' and '\\hrdinhal\\Data\\Desktop\\Analize\\Search engine\\Folder 1\\Daily Production Summary 1.pdf' are the same file
由于某种原因,它需要 dst 并用 src 替换它。为什么?以及如何解决?
dst
Out[99]: WindowsPath('/hrdinhal/Data/Desktop/Analize/Search engine/Folder 2')
file_name
Out[100]: <DirEntry 'Daily Production Summary 1.pdf'>
dst/file_name
Out[101]: WindowsPath('/hrdinhal/Data/Desktop/Analize/Search engine/Folder 1/Daily Production Summary 1.pdf')
它将文件夹 2 更改为文件夹 1!
【问题讨论】:
-
使用
print()在不同时刻查看变量中的值 - 这称为“打印调试” - 也许这可以帮助您找到问题所在。 -
代码似乎没问题。您必须自己调试它以查看变量何时更改值。您的输出带有前缀
Out[99]:。Out[100]:、Out[101]:可能意味着您在某些ipython或juputer中运行它,因此您可以运行其他更改此变量的代码。最好将代码放入文件并正常运行:python script.py -
BTW:我不明白你为什么使用
for match-循环来执行copyfile。如果它找到许多匹配项,那么它会多次运行相同的copyfile- 这没有任何意义。我宁愿使用if re.findall():- 只执行一次copyfile。但是for i-loop 也存在同样的问题。如果它在许多页面上找到匹配的模式,那么您将多次复制同一个文件。最好先发送found = False,然后运行循环并在任何页面上匹配时设置found = True。检查所有页面后,您应该执行if found: shutil.copyfile(..)- 它只会复制一次文件。 -
好的,谢谢,for 循环有意义。我不明白你的第二条评论。使用 print() 究竟是什么,在哪里?
-
也许你需要
file_name.name而不是file_name来获取没有完整路径的名称。