如何删除python try / except块中的重复异常错误?

时间:2019-03-06 16:05:37

标签: python

我是一名新的python程序员,一直在使用文件排序功能来获取文件名,并将其整齐地排列在年/月/日的文件结构中。以下代码有效,但看起来很丑陋,并且有很多重复的异常错误要删除。 很想看看如何提高此代码的效率,因为它将经常运行。预先感谢

def fileSort(day, month, year, file):
    global filewritten

    try: os.makedirs(togoto + '/' + year)
    except FileExistsError:
        pass
    try: os.makedirs(togoto + '/' + year + '/' + month)
    except FileExistsError:
        pass
    try:
        os.makedirs(togoto + '/' + year + '/' + month + '/' + day)
    except FileExistsError:
    pass
    try:
        shutil.move(path + '/' + file,
                    togoto + '/' + year + '/' + month + '/' + day + '/' + file)
        filewritten += 1

    except FileExistsError:
        pass

3 个答案:

答案 0 :(得分:1)

您可以定义自己的函数来缩短代码,并且对重复使用也很有帮助:

def create_dir(name):
    try:
        os.makedirs(name)
    except FileExistsError:
        pass

def fileSort(day, month, year, file):
    global filewritten
    create_dir(togoto + '/' + year)
    create_dir(togoto + '/' + year + '/' + month)
    create_dir(togoto + '/' + year + '/' + month + '/' + day)
    try:
        shutil.move(path + '/' + file, togoto + '/' + year + '/' + month + '/' + day + '/' + file)
        filewritten += 1
    except FileExistsError:
        pass

答案 1 :(得分:1)

os.makedirs() already creates the directories leading to the given path,所以应该足够了

try:
    os.makedirs(togoto + '/' + year + '/' + month + '/' + day)
except FileExistsError:
    pass
try:
    shutil.move(path + '/' + file,
                togoto + '/' + year + '/' + month + '/' + day + '/' + file)
    filewritten += 1

except FileExistsError:
    pass

这是对原始版本的改进。

顺便说一句,os.path.join()是你的朋友:

source = os.path.join(path, file)
targetdir = os.path.join(togoto, year, month, day)
target = os.path.join(togoto, year, month, day, file)
try:
    os.makedirs(targetdir)
except FileExistsError:
    pass
try:
    shutil.move(source, target)
    filewritten += 1

except FileExistsError:
    pass

如果您的Python足够新,最好使用os.makedirs()的所有功能:

source = os.path.join(path, file)
targetdir = os.path.join(togoto, year, month, day)
target = os.path.join(targetdir, file)

os.makedirs(targetdir, exist_ok=True) # i. e. no exception on an already existing path.
try:
    shutil.move(source, target)
    filewritten += 1
except FileExistsError:
    pass

答案 2 :(得分:1)

首先:将makedirs与仅位于最内层目录的 一起使用:

try: 
    os.makedirs(togoto + '/' + year + '/' + month + '/' + day)
except FileExistsError:
    pass

然后请注意,您可能应该使用os.path.join来形成路径,因此:

try: 
    os.makedirs(os.path.join(togoto, year, month, day))
except FileExistsError:
    pass 

并且...在Python 3(3.2+)中,有一个参数exists_ok可以设置为True,因此,如果 leaf子目录存在,则不会引发任何异常,所以我们得到

os.makedirs(os.path.join(togoto, year, month, day), exists_ok=True)

最后请注意,如果目标存在,shutil.move可能-也可能不-抛出FileExistsError ...