【问题标题】:SameFileError because of overwriting locationSameFileError 因为覆盖位置
【发布时间】: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]: 可能意味着您在某些 ipythonjuputer 中运行它,因此您可以运行其他更改此变量的代码。最好将代码放入文件并正常运行: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 来获取没有完整路径的名称。

标签: python location shutil


【解决方案1】:

我发现file_name 保留了文件的完整路径,并且该路径替换了srcdst in

src / file_name 
dst / file_name

你只需要得到名字file_name.name

src / file_name.name
dst / file_name.name

顺便说一句:

完整路径

print( file_name.path )

只有文件名

print( file_name.name )

顺便说一句:你在每场比赛后复制同一个文件,但你只能复制一次

使用变量found并在for i-loop之后复制

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'

#print('[DEBUG] (before for file_name) src:', src)

for file_name in os.scandir(src):

    file = PyPDF2.PdfFileReader(str(src / file_name.name), 'rb')
    numPages = file.getNumPages()

    found = False

    # ---

    #print('[DEBUG] (before for i) src:', src)
    
    for i in range(0, numPages):
        pageObj = file.getPage(i)
        text = pageObj.extractText()

        #print('[DEBUG] (before if re) src:', src)

        if re.findall(pattern, text, re.IGNORECASE):
            found = True
            
    # ----

    #print('[DEBUG] (before for found) src:', src)
    
    if found:
        #print('[DEBUG] (before copy) src:', src)
        shutil.copyfile(str(src / file_name.name), str(dst / file_name.name))
        
    

或在第一次复制后使用break 跳过for i-loop

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'

#print('[DEBUG] (before for file_name) src:', src)

for file_name in os.scandir(src):

    #print('[DEBUG] (before pyPDF2) file_name:', file_name)

    file = PyPDF2.PdfFileReader(str(src / file_name.name), 'rb')
    numPages = file.getNumPages()

    # ---

    #print('[DEBUG] (before for i) src:', src)
    
    for i in range(0, numPages):
        pageObj = file.getPage(i)
        text = pageObj.extractText()

        #print('[DEBUG] (before if re) src:', src)

        if re.findall(pattern, text, re.IGNORECASE):
            #print('[DEBUG] (before copy) src:', src)
            shutil.copyfile(str(src / file_name.name), str(dst / file_name.name))
            break # there is no need to check rest of PDF

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多