我需要用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库,并且可以使用!
答案 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]
通常,os
和os.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