2014-11-03 100 views
0

正如你可以看到这是非常非常笨重。我将如何去自动检测文件扩展名?自动检测文件扩展名

txt_files = glob('*txt') 
png_files = glob('*.png') 
jpg_files = glob('*.jpg') 
zip_files = glob('*.zip') 
gif_files = glob('*.gif') 
iso_files = glob('*iso') 
epub_files = glob('*epub') 
ico_files = glob('*.ico') 

#Unimportant bit to question 

for n in txt_files: 
    move_files(n, 'txt') 
for n in png_files: 
    move_files(n, 'png') 
for n in jpg_files: 
    move_files(n, 'jpg') 
for n in zip_files: 
    move_files(n, 'zip') 
for n in gif_files: 
    move_files(n, 'gif') 
for n in iso_files: 
    move_files(n, 'iso') 
for n in epub_files: 
    move_files(n, 'epub') 
for n in ico_files: 
    move_files(n, 'ico') 
+0

是否有原因,你的一些扩展有'.',有些不? – abarnert 2014-11-03 20:20:32

回答

3

为“自动检测新的扩展名”,只是经过所有文件,并看看他们的扩展:

for f in os.listdir(): 
    name, ext = os.path.splitext(f) 
    ext = ext.lstrip('.') 
    if ext: 
     os.mkdirs(ext) 
     move_file(filename, ext) 

请注意,如果你的一些“扩展”的实际上不是这样的扩展将无法正常工作。我注意到您现有的代码搜索诸如*txt*iso之类的东西,这当然会匹配诸如this_is_not_txtspam.aniso等之类的东西。如果这是一个必需的功能,而不是一个错误,那么你必须为你的“扩展”所指的内容制定一些规则,然后才能在代码中实现它...

另请注意,没有扩展名的文件因为那if ext:),并且有一个空的扩展名(只是.)的文件也将是(因为if检查发生在lstrip之后)。如果需要,你当然可以改变其中的任何一种(尽管你需要提出一个子目录名称,它不可能与任何可能的实际扩展模糊不清......)。

最后,这不会处理“双扩展” - 例如,.tar.gz文件将与.gz进入同一目录。同样,如果需要,这很容易改变。

+1

可能值得注意的是没有“。”的文件。扩展名将被忽略。 – martineau 2014-11-03 20:28:26

+0

@martineau:好的,我不确定这是否有必要,但我已经添加了它,谢谢。 – abarnert 2014-11-03 20:39:50

0
for ext in "txt png jpg zip gif iso epub ico".split(): 
    for file in glob("*.%s"%ext): #if there are no files of this type it just skips it 
     move_files(file,ext) 

可能?它不是很清楚你的问题是什么

从某种意义上说,这是“自动检测”以后如果有适合的模式中不存在的文件将跳过move_files一步

+0

这是如何“自动检测新的扩展名”?这只是一种更紧凑的方式来编写他已有的逻辑(除了''''只在'txt'中包含)。 – abarnert 2014-11-03 20:22:48

+0

是的,我不知道他的意思是什么......我只是在说他的陈述“正如你所看到的,这是非常非常困难的。” (我认为他的意思很笨拙......但他并没有详细说明它的笨拙) – 2014-11-03 20:24:50

+1

你是对的,这有点含糊不清。我想他可能意味着他想清理这些代码,然后在最后写一些额外的代码来检测移动后的剩余扩展(例如'unexpected_extensions = {os.path.splitext(f)[1] f in os.listdir()if os.path.isfile(f)}')? – abarnert 2014-11-03 20:26:31