我只搜索.txt文件
from glob import glob
result = glob('*.txt')
>> result
['text1.txt','text2.txt','text3.txt']
但我希望result
没有文件扩展名
>> result
['text1','text2','text3']
我是否可以使用glob
从输出中排除文件扩展名的正则表达式模式,还是必须在result
上使用列表推导?
答案 0 :(得分:2)
使用glob()
无法做到这一点,您需要获取给定的列表,然后创建一个新的列表来存储没有扩展名的值:
import os
from glob import glob
[os.path.splitext(val)[0] for val in glob('*.txt')]
os.path.splitext(val)
将文件名拆分为文件名和扩展名。 [0]
只返回文件名。
答案 1 :(得分:2)
由于您尝试拆分文件扩展名,而不是拆分任意字符串,因此使用os.path.splitext
(或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 ...
答案 2 :(得分:1)
使用索引切片:
result = [i[:-4] for i in result]
答案 3 :(得分:1)
使用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')]
答案 4 :(得分:1)
此glob仅选择不带扩展名的文件:**/*/!(*.*)
答案 5 :(得分:0)
使用str.split
>>> result = [r.split('.')[0] for r in glob('*.txt')]
>>> result
['text1', 'text2', 'text3']