文件名中的Python匹配整数?
我正在创建一个数据文件,该文件的第一列(“id”)中有一个标识符,其中包含一个名称和编号(即name22、name43、name185)。我正在尝试获取标识符中的数字(来自数据文件),并将其与当前文件上方目录中的文件名中的数字进行匹配-这些文件具有不同的名称,但具有相同的对应编号(即old22、old43、old185) 如何将数据文件“id”列中的数字与文件名中的数字进行匹配?我写了下面的脚本,但没有得到任何输出/错误文件名中的Python匹配整数?,python,regex,pandas,Python,Regex,Pandas,我正在创建一个数据文件,该文件的第一列(“id”)中有一个标识符,其中包含一个名称和编号(即name22、name43、name185)。我正在尝试获取标识符中的数字(来自数据文件),并将其与当前文件上方目录中的文件名中的数字进行匹配-这些文件具有不同的名称,但具有相同的对应编号(即old22、old43、old185) 如何将数据文件“id”列中的数字与文件名中的数字进行匹配?我写了下面的脚本,但没有得到任何输出/错误 import os import fnmatch import panda
import os
import fnmatch
import pandas as pd
os.system('grep id *log > data.txt')
df = pd.read_table("data.txt", delim_whitespace=True, header = None)
df.columns = ['id','anum','aname','iso']
num = df.id.str.extract('(\d+)')
regex = r'\d+'
for filename in os.listdir('../'):
if fnmatch.fnmatch(regex,'*.txt'):
f = open(filename,"r"):
...do more things....
此模块提供对Unix shell样式通配符的支持,这些通配符与正则表达式(在re模块中有文档记录)不同。shell样式通配符中使用的特殊字符有:
这意味着您不能使用完整的正则表达式来查找文件名,只能使用shell通配符。我建议使用带有id的*
,例如*123.txt
# assuminng you have id variable
for filename in os.listdir('.'):
if fnmatch.fnmatch(filename, '*{0}.txt'.format(id)):
f = open(filename,"r") #...
您也可以使用
fnmatch.filter
函数,因为上面的解决方案不是最有效的。如果您的id
列如下所示:
f_s = pd.Series(['name22', 'name43', 'name185'])
others = ['old22.txt', 'old43.txt', 'old185.txt', 'mold43.png']
而os.listdir('../')
是这样的:
f_s = pd.Series(['name22', 'name43', 'name185'])
others = ['old22.txt', 'old43.txt', 'old185.txt', 'mold43.png']
您可以在id
列中创建一组数字
id_nbrs = set(f_s.str.extract(r'(\d+)'))
然后使用函数筛选所需的文件:
digits = re.compile(r'(\d+)$')
def f(s):
name, ext = s.split('.')
nbr = digits.search(name).group()
#print(name, ext, nbr)
return nbr in id_nbrs and ext == 'txt'
for thing in filter(f, others):
print(thing)
>>>
old22.txt
old43.txt
old185.txt
>>>
数字是否总是在末尾?是的,它们的格式名称总是XXX。除了从第一列vaules中提取数字之外,您是否使用DataFrame进行其他操作?是的,对于每个匹配文件,我想获取感兴趣的列,并使用字典将其与data.txt文件匹配。您的Python版本是什么?