我是一名新的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
答案 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
...