Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件名中的Python匹配整数?_Python_Regex_Pandas - Fatal编程技术网

文件名中的Python匹配整数?

文件名中的Python匹配整数?,python,regex,pandas,Python,Regex,Pandas,我正在创建一个数据文件,该文件的第一列(“id”)中有一个标识符,其中包含一个名称和编号(即name22、name43、name185)。我正在尝试获取标识符中的数字(来自数据文件),并将其与当前文件上方目录中的文件名中的数字进行匹配-这些文件具有不同的名称,但具有相同的对应编号(即old22、old43、old185) 如何将数据文件“id”列中的数字与文件名中的数字进行匹配?我写了下面的脚本,但没有得到任何输出/错误 import os import fnmatch import panda

我正在创建一个数据文件,该文件的第一列(“id”)中有一个标识符,其中包含一个名称和编号(即name22、name43、name185)。我正在尝试获取标识符中的数字(来自数据文件),并将其与当前文件上方目录中的文件名中的数字进行匹配-这些文件具有不同的名称,但具有相同的对应编号(即old22、old43、old185)

如何将数据文件“id”列中的数字与文件名中的数字进行匹配?我写了下面的脚本,但没有得到任何输出/错误

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版本是什么?