我遇到了一个问题,我尝试将文件从源位置移动到目标位置。该脚本第一次工作,但是当我再次运行它并且文件/目录存在时;它会抛出此错误
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
答案 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(例如目录已经存在)的替代方法将是另一种有效的方法。