如何在Python中获取目录中文件名(不带扩展名)的列表?

6
假设我的文件夹结构为:
+Data
  -abc.jpg
  -db.jpg
  -ap.jpg

输入为 'path/to/Data'

期望输出为 ['abc', 'db', 'ap']

我看到很多类似的问题,但没有得到我想要的答案。 我喜欢在Python中使用os模块。


可能是重复的问题:如何列出目录中的所有文件? - Christian König
提取文件名可以参考这里:在Python中从文件名中提取扩展名 - Christian König
看一下 os.walk()。 - Anton vBR
6个回答

14

只需尝试这个:

l=os.listdir('path')
li=[x.split('.')[0] for x in l]
  1. 首先列出您的目录文件
  2. 通过.分割文件并获取第一个参数。

如果文件名本身包含一个句点会发生什么?(macOS允许这样做。)有没有办法确保文件使用最后一个句点进行拆分? - Peter Schorn
可以的,你可以先使用分割函数去掉最后一个单词,然后将剩余的值合并起来。 - Mohamed Thasin ah

10
import os    
files_no_ext = [".".join(f.split(".")[:-1]) for f in os.listdir() if os.path.isfile(f)]
print(files_no_ext)

1
os.listdir不区分目录和文件,因此您的列表将包含子目录(大多为空)的条目。 - Christian König
3
你还可以通过 os.path.splitext(f)[0] 代替 join/split,这会处理某些特殊情况(例如基础名称开头的句点)。 - Christian König

3
import glob
from pathlib import Path

for f in glob.glob("*.*"):
    print(Path(f).stem)

2
谢谢您的回答,只是补充一下,应该是import pathlib,然后pathlib.Path(f).stem - Yeo Keat

2
import os
filenames=next(os.walk(os.getcwd()))[2]
efn=[f.split('.')[0] for f in filenames]

os.getcwd()   #for get current directory path

1
你可以使用os.listdir,它需要路径作为参数并返回其中文件目录的列表。
>>> list_ = os.listdir("path/to/Data")
>>> list_
>>> ['abc.jpg', 'dn.jpg', 'ap.jpg'] 使用该列表,您只需进行一个推导列表,将每个元素在“.”(点)上拆分,取除最后一个元素外的所有元素,并使用“.”(点)将它们连接起来,并检查该元素是否是一个文件,使用os.path.isfile()>>> list_ = ['.'.join(x.split('.')[:-1]) for x in os.listdir("path/to/Data") if os.path.isfile(os.path.join('path/to/Data', x))]
>>> list_
>>> ['abc', 'dn', 'ap']

0
    import os
    from os import listdir
    from os.path import isfile, join
    def filesMinusExtension(path):
        # os.path.splitext(f)[0] map with filename without extension with checking if file exists.
        files = [os.path.splitext(f)[0] for f in listdir(path) if isfile(join(path, f))];
        return files;

你的代码有一些问题... 但是,让我困扰的是:分号?你是Python程序员,直接把它们扔掉吧! - Darkaird
感谢您的反馈。是的,Java背景似乎有时会影响我在Python中输入分号的能力。无论如何,您能分享一下这段代码可能出现的问题吗? - grimur82
除了分号以外,为什么要这样导入isfile和join而不是对os.path.splittext进行相同的操作呢? 此外,您使用了推导列表来进行过滤(右侧的'if'),但没有用于映射。 您只需要执行[os.path.splitext(f)[0] for f in listdir(path) if isfile(join(path, f))] - Darkaird
好的,我已经做了研究,你是正确的。我的修改方案去除了冗余和不必要的代码。 - grimur82
如果您愿意,甚至可以不使用中间变量,直接返回推导列表。 - Darkaird

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