Python Glob仅返回文件名而非完整路径

138

我能否在目录上使用glob,获取特定扩展名的文件,但只返回文件名本身,不包括整个路径?

10个回答

201

这并不完全与相对文件匹配有关。想象一下模式是 "sql/*.sql"os.listdir 函数实际上会列出相对于给定目录的文件路径,但它无法处理模式。编辑:啊,我正在寻找这个答案:https://dev59.com/TlcO5IYBdhLWcg3w-V_0#44994860 技巧是使用 os.path.relpath 而不是 basename - Leonid
谢谢你的回答。如何去掉扩展名部分,比如 .csv、.dat、.nc 等等。 - Azam

184
这可能对某些人有帮助: <代码>names = [os.path.basename(x) for x in glob.glob('/你的路径')

如果他们想要相对于'/your_path'的路径而不仅仅是文件名,那么他们可以使用os.path.relpath而不是os.path.basename - Leonid
relpath或者只是old = os.getcwd(); os.chdir(dir); files = glob.glob('**/*.txt'); os.chdir(old) - milahu

19
map(os.path.basename, glob.glob("your/path"))
返回一个包含所有文件名和扩展名的可迭代对象。

5

对我来说,os.path.basename很好用。

以下是代码示例:

import sys,glob
import os

expectedDir = sys.argv[1]                                                    ## User input for directory where files to search

for fileName_relative in glob.glob(expectedDir+"**/*.txt",recursive=True):       ## first get full file name with directores using for loop

    print("Full file name with directories: ", fileName_relative)

    fileName_absolute = os.path.basename(fileName_relative)                 ## Now get the file name with os.path.basename

    print("Only file name: ", fileName_absolute)

输出:

Full file name with directories:  C:\Users\erinksh\PycharmProjects\EMM_Test2\venv\Lib\site-packages\wheel-0.33.6.dist-info\top_level.txt
Only file name:  top_level.txt

你混淆了变量名:absolute 意味着完整路径;relative 只表示基本名称。 - omatai

4
使用pathlib也可以:
from pathlib import Path

dir_URL = Path("your_directory_URL") # e.g. Path("/tmp")
filename_list = [file.name for file in dir_URL.glob("your_pattern")]

3
我经常重写相对文件匹配的解决方案(尤其是当我需要将项目添加到zipfile时) - 这通常是最终的样子。
# Function
def rel_glob(pattern, rel):
    """glob.glob but with relative path
    """
    for v in glob.glob(os.path.join(rel, pattern)):
        yield v[len(rel):].lstrip("/")

# Use
# For example, when you have files like: 'dir1/dir2/*.py'
for p in rel_glob("dir2/*.py", "dir1"):
    # do work
    pass

2

2
如果您正在寻找CSV文件:
file = [os.path.basename(x) for x in glob.glob(r'C:\Users\rajat.prakash\Downloads//' + '*.csv')]

如果您正在寻找 EXCEL 文件:

file = [os.path.basename(x) for x in glob.glob(r'C:\Users\rajat.prakash\Downloads//' + '*.xlsx')]

1
使用glob.glob("*.filetype")获取所有带路径的文件列表,使用os.path.basename(list_item)移除额外的路径并仅保留文件名。
以下是示例:
import glob
a=glob.glob("*.pkl")

该函数返回以.pkl结尾的每个文件的完整路径列表。

现在你可以使用以下方法删除路径信息并仅提取列表项的文件名:

import os
b=os.path.basename(a[0]) 
# This is an example to extract filename for only one list item

如果您需要创建仅包含文件名的完整列表:
bb=[os.path.basename(list_item) for list_item in a]

1
for f in glob.glob(gt_path + "/*.png"):  # find all png files
      exc_name = f.split('/')[-1].split(',')[0]

然后exc_name就像myphoto.png


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接