用Python获取部分文件名
我是新手 我刚刚用Python/编码工作了几天,但我想创建一个脚本,该脚本捕获与特定模式对应的部分文件名,并将其输出到文本文件 在我的例子中,假设我有四个.pdf,如下所示:用Python获取部分文件名,python,filenames,Python,Filenames,我是新手 我刚刚用Python/编码工作了几天,但我想创建一个脚本,该脚本捕获与特定模式对应的部分文件名,并将其输出到文本文件 在我的例子中,假设我有四个.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_3;”之后和文件扩展名之前抓取字符串 你能告诉我哪些Pytho
aaa_ID_8423.pdf
bbbb_ID_8852.pdf
ccccc_ID_7413.pdf
dddddd_ID_4421.pdf
(Note that they are of variable length.)
我想让脚本遍历这些文件名,在“ID_3;”之后和文件扩展名之前抓取字符串
你能告诉我哪些Python模块和可能的指南可以帮助我吗?如果数字是可变长度的,你会想要regex模块“re” 正则表达式通常用于匹配变量字符串。我刚刚写的正则表达式说:
查找下划线(“\”),后跟可变位数(“[0-9]+”),后跟字符串中的最后一个句点(“\.[^\.]+$”)如果数字长度可变,则需要正则表达式模块“re” 正则表达式通常用于匹配变量字符串。我刚刚写的正则表达式说:
查找一个下划线(“\”),后跟可变位数(“[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)
重新导入
对于文件名中的文件名:
m=re.search(“(?您可以使用python中的os模块并执行listdir以获取该路径中存在的文件名列表,如下所示:
import os
filenames = os.listdir(path)
现在,您可以迭代文件名列表,并使用正则表达式查找所需的模式:
import re
for filename in filenames:
m = re.search('(?<=ID_)\w+', filename)
print (m)
重新导入
对于文件名中的文件名:
m=re.search(“(?您可能希望使用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']
您可能想使用glob,它是用于文件globbing的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模块的简单解决方案,如其他答案中所述
# 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()
等解决方案同样有效、有用且具有指导意义):
这里还有另一种选择,使用re.split()
,这可能更接近您正试图做的事情的精神(尽管使用re.match()
和re.search()
等解决方案同样有效、有用且有指导意义):
如果这些是字符串中唯一可以使用的数字,那么库是re ID=re.findall(r“[0-9]+”,*stringname”)如果这些是字符串中唯一可以使用的数字,那么库是re ID=re.findall(r“[0-9]+”,*stringname”)为了详细说明这一点,请看一看在中找到的正则表达式库,还有一些在网上流传的正则表达式备忘单,其中包括解释KCzar程序是如何工作的。为了详细说明这一点,请看一看在中找到的正则表达式库,还有一些正则表达式网上流传的备忘单,包括解释KCzar程序工作原理的备忘单。谢谢你的回答。我用一个实际的文件尝试了这一点,得到了这样的回答:
它似乎在某个位置找到了ID,但无法将其输出字符串。知道我做错了什么吗?为什么要将导入放在for lo中op?因为我写答案时没有注意;)。谢谢你的更正。编辑它。嗨,谢谢你的回答。我用一个实际的文件尝试了这个方法,得到了这样的回答:
它似乎在某个位置找到了ID,但无法让它输出字符串。你知道我做错了什么吗?为什么要将导入放在for循环中?因为我在编写时没有注意请回答;)。谢谢您的更正。请编辑它。