Python 自动检测文件扩展名

Python 自动检测文件扩展名,python,Python,正如你所见,这是非常非常笨重。如何自动检测文件扩展名 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 bi

正如你所见,这是非常非常笨重。如何自动检测文件扩展名

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')
也许吧?你的问题不是很清楚

从某种意义上说,这是“自动检测”的,因为如果没有适合该模式的文件,它将跳过
移动\u文件
步骤

也许吧?你的问题不是很清楚

从某种意义上说,这是“自动检测”,因为如果没有符合模式的文件,它将跳过“自动检测新扩展名”的
move_files
步骤,只需浏览所有文件并查看其扩展名:

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\u not \u txt
spam.aniso
之类的东西。如果这是一个必需的特性,而不是一个bug,那么在您可以在代码中实现它之前,您必须为“扩展”的含义想出一些规则

还请注意,完全没有扩展名的文件将保留在原来的位置(因为
if ext:
),而扩展名为空的文件(只是
)也将保留在原来的位置(因为
if
检查发生在
lstrip
之后)。当然,如果需要的话,您可以更改其中的任何一个(尽管您需要提供一个子目录名,它不能与任何可能的实际扩展名混淆…)

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

要“自动检测新扩展名”,只需浏览所有文件并查看其扩展名:

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\u not \u txt
spam.aniso
之类的东西。如果这是一个必需的特性,而不是一个bug,那么在您可以在代码中实现它之前,您必须为“扩展”的含义想出一些规则

还请注意,完全没有扩展名的文件将保留在原来的位置(因为
if ext:
),而扩展名为空的文件(只是
)也将保留在原来的位置(因为
if
检查发生在
lstrip
之后)。当然,如果需要的话,您可以更改其中的任何一个(尽管您需要提供一个子目录名,它不能与任何可能的实际扩展名混淆…)


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

您的一些扩展有
和没有
的原因吗?您的一些扩展有
和没有
的原因吗?这是如何“自动检测新扩展”的?这只是一种更简洁的方式来编写他已有的逻辑(除了你只在
txt
中包含
*
)。是的,我不知道他说的是什么意思。。。我只是针对他的陈述“正如你所看到的,这是非常非常笨拙的。”(我想他指的是笨拙……但他没有具体说明它是如何笨拙的)你是对的,这有点含糊不清。我想他可能是想清理这段代码,然后在最后编写一些额外的代码来检测移动后的剩余扩展(例如,
unexpected_extensions={os.path.splitext(f)[1]for f in os.listdir()if os.path.isfile(f)}
)?(不管怎样,我给了你+1…因为我希望这是他想要的更多…也许…)这是如何“自动检测新的扩展”?这只是一种更简洁的方式来编写他已有的逻辑(除了你只在
txt
中包含
*
)是的,我不知道他那句话是什么意思…我只是在回答他的话“正如你所看到的,这是非常非常非常笨拙的。”(我想他是指笨拙…但他没有具体说明它是如何笨拙的)你是对的,这有点模棱两可。我想他可能是想清理这段代码,然后在最后写一些额外的代码来检测移动后剩余的扩展名(例如,
unexpected_extensions={os.path.splitext(f)[1]for f in os.listdir()if os.path.isfile(f)}
)?(无论如何,我给了你+1…因为我希望这是他想要的…也许…)可能值得注意的是,没有扩展名“.”的文件将被忽略。@martineau:好的,我不确定这是否必要,但我已经添加了它,谢谢。可能值得注意的是,没有扩展名“.”的文件扩展将被忽略。@martineau:好的,我不确定是否有必要,但我已经添加了它,谢谢。