如果文件和目录存在

时间:2017-07-15 00:32:34

标签: python

我遇到了一个问题,我尝试将文件从源位置移动到目标位置。该脚本第一次工作,但是当我再次运行它并且文件/目录存在时;它会抛出此错误

Traceback (most recent call last):
  File "/Users/fela/Downloads/script.py", line 118, in save_pics
    os.mkdir(dst_pics)
FileExistsError: [Errno 17] File exists: '/Users/dela/Downloads/Dest/Pictures/'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/fela/Downloads/script.py", line 385, in <module>
    save_pics(msg, user_name)
  File "/Users/fela/Downloads/script.py", line 120, in save_pics
    shutil.move(png, dst_pics)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/shutil.py", line 542, in move
    raise Error("Destination path '%s' already exists" % real_dst)
shutil.Error: Destination path '/Users/fela/Downloads/Dest/Pictures/image001.png' already exists

这是我的代码:

src = /Users/fela/Downloads/Source
dst_pics = /Users/fela/Downloads/Dest/Pictures

    for png in glob.iglob(os.path.join(src, "*.png")):
        if os.path.isfile(png):
            try:
                os.mkdir(dst_pics)
            except:
                shutil.move(png, dst_pics)
                continue

    for jpg in glob.iglob(os.path.join(src, "*.[jJ][pP][gG]")):
        if os.path.isfile(jpg):
            try:
                shutil.move(jpg, dst_pics)
            except:
                continue

3 个答案:

答案 0 :(得分:1)

我建议在循环之外创建目录。这将简化您的代码。

import os

src = '/Users/fela/Downloads/Source'
dst_pics = '/Users/fela/Downloads/Dest/Pictures'

try:
    os.mkdir(dst_pics) # will create the directory only if it does not exist
except FileExistsError:
    pass

for png in glob.iglob(os.path.join(src, "*.png")):
    if os.path.isfile(png):
        shutil.move(png, dst_pics)

for jpg in glob.iglob(os.path.join(src, "*.[jJ][pP][gG]")):
    if os.path.isfile(jpg):
        shutil.move(jpg, dst_pics)

答案 1 :(得分:0)

好的,你遇到的部分问题是os.mkdir()需要一个字符串或对一个字符串的引用。 (正如我刚才所说,应该有&#39;&#39;或&#34;&#34;围绕它)

@ Coldspeed再次打败了我这个问题。

dist_pics = '/Users/fela/Downloads/Dest/Pictures'

然后引用它。不要太狡猾,请关注@Coldspeed以获得余下的答案。

答案 2 :(得分:0)

如果由于某种原因需要在循环内创建目录,请在尝试创建目录之前添加代码以检查目录是否已存在。

例如

if os.path.isfile(png):
            try:
                if not os.path.isdir(dst_pics):
                    os.mkdir(dst_pics)
            except:
                shutil.move(png, dst_pics)
                continue

您需要执行此操作的原因是os.mkdir如果目录已存在则会引发异常。它旨在实现这一目标。

在可能的情况下,@coldspeed指出在循环外创建目录并传递任何execption(例如目录已经存在)的替代方法将是另一种有效的方法。