我对Python相当陌生(大约3周),并且正在基于csv列表复制文件。我只是不明白为什么os.path.isfile()在我的代码中返回TRUE,即使文件还不存在,在我使用shutil在if条件中复制之前。
我从一个转换自csv的 Dataframe 中遍历源(src)和目标(tgt),并将目标os.path.isfile()赋值给一个变量TGT_EXIST来检查目标文件。我甚至在此期间强制它为'False'来检查它是如何变化的。
import pandas as pd
import os
import shutil
df = pd.read_csv(file_path)
for index, row in df.iterrows():
# Read csv rows
src = row['Source']
tgt = row['Target']
TGT_EXIST = False
print("Test 0", TGT_EXIST)
# Check Target filepath if pre-existing
TGT_EXIST = os.path.isfile(tgt)
print("Test 00", TGT_EXIST)
print(tgt)
if TGT_EXIST and filecmp.cmp(src, tgt):
print("Target : Exists, same.")
elif TGT_EXIST and not filecmp.cmp(src, tgt):
print("Target : Exists, not same. Will not copy.")
elif not TGT_EXIST:
print("Target : Not exists. Copying...")
shutil.copyfile(src, tgt)
基于我下面的测试打印,'Test 0'和'Test 00',TGT_EXIST在赋值变量后返回True,即使它还不存在,即使我在再次运行之前从目标文件夹中删除了它,甚至在shutil.copyfile()elif条件之前。它直接进入第一个if条件,“Target:存在,一样。”Test 0 False Test 00 True F:\TEST COPY2018\20181231\DMC-LX7\P1070674.MP4 Target : Exists, same.
然而,当我在第三个if条件中注解掉shutil.copyfile(src,tgt)行时,情况并非如此,elif not TGT_EXIST:Test 0 False Test 00 False F:\TEST COPY2018\20181231\DMC-LX7\P1070674.MP4 Target : Not exists. Copying..
我没有其他的shutil.copyfile(),除了if条件中的内容,所以我很困惑为什么它会提前复制,或者在复制之前就返回True。(我还在jupyter中重新启动了内核以清除变量)
我只有2个测试文件,那么脚本的处理速度是否快到在测试目标文件时执行副本?或者在编写if条件时是否有更精确的原因?
感谢任何意见。谢谢。
1条答案
按热度按时间fbcarpbf1#
您看到的行为很可能是由于os.path.isfile()根据文件的路径检查文件是否存在。它不考虑文件是否打开。因此,即使您在调用os.path.isfile()之前删除文件,如果文件在其他进程或应用程序中打开,它仍然可能返回True。
在您的例子中,可能文件仍在后台打开,操作系统尚未完全释放其句柄,导致os.path.isfile()返回True。当您注解掉shutil.copyfile()行时,该文件不会被您的程序打开和关闭,这可能解释了为什么os.path.isfile()在这种情况下返回False。
解决此问题的一种方法是在shutil.copyfile()调用周围使用try-except块,捕获文件不存在时将引发的FileNotFoundError。例如: