使用python扫描文件夹中所有确定的文件

时间:2019-06-27 21:21:57

标签: python

我需要用python编写代码,以扫描包含确定的扩展名(如.exe,.jpg,.pdf)的文件夹中的所有文件。

就像linux命令“ ls | grep * .pdf”

我尝试使用包含我需要的所有扩展名的列表,并使用正则表达式在文件夹内进行搜索。但是我不知道在re.search()里面放什么

我不想使用“ os”库之类的东西,因为该脚本需要在Linux和Windows上运行。

#!/usr/bin/python

import re

file_types = [".exe", ".jpg", ".pdf", ".png", ".txt"]

for line in file_types:
    # Do something like "ls | grep * + line"
    namefile = re.search(line, i_dont_know_what_to_put_here)
    print(namefile)

更新:谢谢大家的帮助,我使用了glob库,并且可以使用!

4 个答案:

答案 0 :(得分:0)

尝试os.listdir()

import os
file_types = ["exe", "jpg", "pdf", "png", "txt"]
files = [f for f in os.listdir('.') if os.path.isfile(f)]
# filter on file type
files = [f for f in files if f.split('.')[-1] in file_types]

通常,osos.path模块在​​这里对您非常有用。您可以使用正则表达式,但是除非性能非常重要,否则我不会打扰。

答案 1 :(得分:0)

我的建议(它将在所有操作系统上均适用-Windows,Linux和macOS):

import os
file_types = [".exe", ".jpg", ".pdf", ".png", ".txt"]
files = [entry.path for entry in os.scandir('.') if entry.is_file() and os.path.splitext(entry.name)[1] in file_types]

或(如果您只想使用文件名而不是完整路径):

files = [entry.name for entry in os.scandir('.') if entry.is_file() and os.path.splitext(entry.name)[1] in file_types]

答案 2 :(得分:0)

在此处添加其他注释,如果您仍然希望使用re,则应使用的方式为:

re.search(<string to search for(regex)>, <string to search IN>)

所以在您的情况下,假设您的文件类型=“ .pdf”,您的代码将为:

re.search(".*\{}".format(filetype), filename)

其中。*表示“匹配任何字符0次或多次”,而'\'连同“ .pdf”表示“其中名称包含.pdf”(\是一个转义字符,因此该点赢得了不会翻译成正则表达式)。我相信您也可以在正则表达式的末尾添加一个$,以表示“这是字符串的末尾”。

正如这里所提到的,os.listdir对于Windows和Linux都可以正常工作。

希望有帮助。

答案 3 :(得分:0)

您可以使用os模块来避免使用glob模块,该模块可以通过正则表达式(即* .py)过滤文件

from glob import glob
file_types = [".exe", ".jpg", ".pdf", ".png", ".txt"]
path = "path/to/files/*{}"


fnames = [ fname for fnames in [[fname for fname in glob( path.format( ext ))] for ext in file_types] for fname in fnames]

难以阅读,但等效为:

from glob import glob 
file_types = [".exe", ".jpg", ".pdf", ".png", ".txt"]
fnames = []
for ext in file_types:
    for fname in glob( path.format( ext )):
        fnames.append( fname )

编辑:我不确定其他答案已经考虑过的跨平台工作方式。

EDIT2:glob在Windows中使用时可能会有意想不到的副作用。 Getting Every File in a Windows Directory