使用glob

时间:2018-06-18 16:31:18

标签: python glob

我只搜索.txt文件

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

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

但我希望result没有文件扩展名

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

我是否可以使用glob从输出中排除文件扩展名的正则表达式模式,还是必须在result上使用列表推导?

6 个答案:

答案 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']