2013-03-06 48 views
1

我有一种情况,我想将MP3存储在一个目录中,如果该目录不存在,则创建该目录,如果无法创建目录,则退出该程序。我读了os.path.exists()涉及更多的是命中的性能比os.makedirs()的,所以考虑到这一点我制作了下面的代码:当目录不存在时的错误处理

try: 
    # If directory has not yet been created 
    os.makedirs('Tracks') 
    with open('Tracks/' + title + '.mp3', 'w') as mp3: 
     mp3.write(mp3File.content) 
     print '%s has been created.' % fileName 

except OSError, e: 
    # If directory has already been created and is accessible 
    if os.path.exists('Tracks'): 
     with open('Tracks/' + title + '.mp3', 'w') as mp3: 
      mp3.write(mp3File.content) 
      print '%s has been created.' % fileName 

    else: # Directory cannot be created because of file permissions, etc. 
     sys.exit("Error creating 'Tracks' Directory. Cannot save MP3. Check permissions.") 

这是否有道理?或者我应该坚持使用更简洁,但可能更昂贵的版本来简单地检查目录是否存在,然后再创建它? 9/10次,该目录将在那里。

+1

不管你的选择,你不不需要让大部分代码都写两次。 '尝试'做'dir',并且如果它存在则捕获异常。但是,在整个模块完成后再打开它。 – askewchan 2013-03-06 22:37:47

回答

1

try-except块可能会更快,但@ t-8ch说,它并不重要。然而,它并没有如此“不洁”:

try: 
    # try the thing you expect to work 
    mp3 = open('Tracks/' + title + '.mp3', 'w') 
except OSError, e: 
    # exception is for the unlikely case 
    os.makedirs('Tracks') 
    mp3 = open('Tracks/' + title + '.mp3', 'w') 

mp3.write(mp3File.content) 
mp3.close() 
print '%s has been created.' % fileName 

如果你想try使目录第一,你可以这样做:

try: 
    # If directory has not yet been created 
    os.makedirs('Tracks') 
except OSError, e: 
    # If directory has already been created or is inaccessible 
    if not os.path.exists('Tracks') 
     sys.exit("Error creating 'Tracks' Directory. Cannot save MP3. Check permissions.") 
with open('Tracks/' + title + '.mp3', 'w') as mp3: 
    mp3.write(mp3File.content) 
    print '%s has been created.' % fileName 
4

“我们应该忘记小的效率,讲的时候约97%:过早的优化是所有罪恶的根源”

- 高德纳。

你的代码看起来并不重要。我会采取更清洁的路线。

相关问题