使用 glob 获取没有文件扩展名的文件名

Getting file names without file extensions with glob

我只搜索 .txt 文件

from glob import glob
result = glob('*.txt')

>> result
['text1.txt','text2.txt','text3.txt']

但我想要 result 没有文件扩展名

>> result
['text1','text2','text3']

是否有正则表达式模式可以与 glob 一起使用以从输出中排除文件扩展名,或者我是否必须在 result 上使用列表理解?

使用索引切片:

result = [i[:-4] for i in result]

使用str.split

>>> result = [r.split('.')[0] for r in glob('*.txt')]
>>> result
['text1', 'text2', 'text3']

使用rsplit的另一种方式:

>>> result = ['text1.txt','text2.txt.txt','text3.txt']
>>> [x.rsplit('.txt', 1)[0] for x in result]
['text1', 'text2.txt', 'text3']

你可以做一个列表理解:

result = [x.rsplit(".txt", 1)[0] for x in glob('*.txt')]

glob()无法做到这一点,您需要获取给定的列表,然后创建一个新的列表来存储不带扩展名的值:

import os
from glob import glob

[os.path.splitext(val)[0] for val in glob('*.txt')]

os.path.splitext(val) 将文件名拆分为文件名和扩展名。 [0] 只是 returns 文件名。

由于您要拆分的是文件扩展名,而不是拆分任意字符串,因此使用 os.path.splitext (or the pathlib 模块更有意义)。虽然它确实在目前重要的唯一平台(Windows 和 *nix)上没有 实用 差异,但它在概念上仍然更清楚你在做什么。 (如果您稍后开始使用类路径对象而不是字符串,它将继续以不变的方式工作,以启动。)

所以:

paths = [os.path.splitext(path)[0] for path in paths]

与此同时,如果出于某种原因这确实冒犯了您,那么 glob 在幕后所做的只是调用 fnmatch 将您的 glob 表达式转换为正则表达式,然后将其应用于所有文件名。因此,您可以通过自己替换正则表达式并使用捕获组来替换它:

rtxt = re.compile(r'(.*?)\.txt')
files = (rtxt.match(file) for file in os.listdir(dirpath))
files = [match.group(1) for match in files if match]

这样一来,您就不会在 glob 中已经存在的列表之上做一个 listcomp;你正在做一个 而不是 已经在 glob 中的那个。我不确定这是否是一个有用的胜利,但由于您似乎对消除 listcomp 感兴趣……

这个 glob 只选择没有扩展名的文件:**/*/!(*.*)