使用 Python 抓取部分文件名
Grab part of filename with Python
这里是新手。
我刚刚使用 Python/coding 几天,但我想创建一个脚本来抓取与特定模式对应的部分文件名,并将其输出到文本文件。
所以就我而言,假设我有四个这样的 .pdf:
aaa_ID_8423.pdf
bbbb_ID_8852.pdf
ccccc_ID_7413.pdf
dddddd_ID_4421.pdf
(Note that they are of variable length.)
我希望脚本遍历这些文件名,获取 "ID_" 之后和文件扩展名之前的字符串。
您能否为我指明 Python 模块和可能的指南可以帮助我的方向?
如果数字是可变长度的,您将需要正则表达式模块 "re"
import re
# create and compile a regex pattern
pattern = re.compile(r"_([0-9]+)\.[^\.]+$")
pattern.search("abc_ID_8423.pdf").group(1)
Out[23]: '8423'
正则表达式一般用于匹配可变字符串。我刚刚写的正则表达式说:
查找下划线 ("_"),后跟可变位数 ("[0-9]+"),再后跟字符串中的最后一个句点 ("\.[^\.]+ $")
您可以使用 python 中的 os 模块并执行 listdir 以获取该路径中存在的文件名列表,如下所示:
import os
filenames = os.listdir(path)
现在您可以遍历文件名列表并使用正则表达式查找您需要的模式:
import re
for filename in filenames:
m = re.search('(?<=ID_)\w+', filename)
print (m)
上面的代码片段将return ID_ 后面的文件名部分打印出来。因此,对于您的示例,它将 return 4421.pdf、8423.pdf 等。您可以编写类似的正则表达式来删除 .pdf 部分。
您可能想要使用 glob,这是一个 python 文件通配模块。来自 python 帮助页面的用法如下:
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
这是一个使用 re 模块的简单解决方案,如其他答案中所述。
# Libraries
import re
# Example filenames. Use glob as described below to grab your pdf filenames
file_list = ['name_ID_123.pdf','name2_ID_456.pdf'] # glob.glob("*.pdf")
for fname in file_list:
res = re.findall("ID_(\d+).pdf", fname)
if not res: continue
print res[0] # You can append the result to a list
下面应该是您的输出。您应该能够将其适应其他模式。
# Output
123
456
祝你好运!
这是另一种选择,使用 re.split()
,这可能更接近于您正在尝试做的事情的精神(尽管 re.match()
和 re.search()
等解决方案, 同样有效、有用和有指导意义):
>>> import re
>>> re.split("[_.]", "dddddd_ID_4421.pdf")[-2]
'4421'
>>>
这里是新手。
我刚刚使用 Python/coding 几天,但我想创建一个脚本来抓取与特定模式对应的部分文件名,并将其输出到文本文件。
所以就我而言,假设我有四个这样的 .pdf:
aaa_ID_8423.pdf
bbbb_ID_8852.pdf
ccccc_ID_7413.pdf
dddddd_ID_4421.pdf
(Note that they are of variable length.)
我希望脚本遍历这些文件名,获取 "ID_" 之后和文件扩展名之前的字符串。
您能否为我指明 Python 模块和可能的指南可以帮助我的方向?
如果数字是可变长度的,您将需要正则表达式模块 "re"
import re
# create and compile a regex pattern
pattern = re.compile(r"_([0-9]+)\.[^\.]+$")
pattern.search("abc_ID_8423.pdf").group(1)
Out[23]: '8423'
正则表达式一般用于匹配可变字符串。我刚刚写的正则表达式说:
查找下划线 ("_"),后跟可变位数 ("[0-9]+"),再后跟字符串中的最后一个句点 ("\.[^\.]+ $")
您可以使用 python 中的 os 模块并执行 listdir 以获取该路径中存在的文件名列表,如下所示:
import os
filenames = os.listdir(path)
现在您可以遍历文件名列表并使用正则表达式查找您需要的模式:
import re
for filename in filenames:
m = re.search('(?<=ID_)\w+', filename)
print (m)
上面的代码片段将return ID_ 后面的文件名部分打印出来。因此,对于您的示例,它将 return 4421.pdf、8423.pdf 等。您可以编写类似的正则表达式来删除 .pdf 部分。
您可能想要使用 glob,这是一个 python 文件通配模块。来自 python 帮助页面的用法如下:
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
这是一个使用 re 模块的简单解决方案,如其他答案中所述。
# Libraries
import re
# Example filenames. Use glob as described below to grab your pdf filenames
file_list = ['name_ID_123.pdf','name2_ID_456.pdf'] # glob.glob("*.pdf")
for fname in file_list:
res = re.findall("ID_(\d+).pdf", fname)
if not res: continue
print res[0] # You can append the result to a list
下面应该是您的输出。您应该能够将其适应其他模式。
# Output
123
456
祝你好运!
这是另一种选择,使用 re.split()
,这可能更接近于您正在尝试做的事情的精神(尽管 re.match()
和 re.search()
等解决方案, 同样有效、有用和有指导意义):
>>> import re
>>> re.split("[_.]", "dddddd_ID_4421.pdf")[-2]
'4421'
>>>