使用 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 只选择没有扩展名的文件:**/*/!(*.*)
我只搜索 .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 只选择没有扩展名的文件:**/*/!(*.*)