在 pdm 文件中搜索关键字并提取该关键字

Searching a key word in a pdm file and pulling that key word

所以我有代码可以搜索目录以查找文件名末尾有 cdm 的文件。我将文件的路径保存到数据框中。如何在我的搜索中添加一种在这些文件中查找单词“ID”然后提取该单词旁边的 16 位随机数的方法?只需在文件中添加此 ID。我还想将这些 ID 存储在数据框中。我想要自动化的原因是因为有 457 个文件。

这是格式示例:

<?PowerDesigner AppLocale="UTF16" ID="{F4847BC0-D005-4204-964A-9C0DFE28416E}" Label="" LastModificationDate="1609351245" Name="WORKPLACE INVESTING BACKUP" Objects="857" Symbols="302" Type="{1E597170-9350-11D1-AB3C-0020AF71E433}" signature="CDM_DATA_MODEL_XML" version="16.7.1.6488"?>

我要的值是ID后面的值

import os  
import pandas as pd
#This variable was created to save time by staring it at the W folder and go from there.
current_dur = r'Workplace'
#empty data frame to put the file paths in.
cdm_files = []


for root, dirs, files in os.walk(current_dur):
    for file in files:
         if file.endswith('.cdm'):
            pdm_files.append(os.path.join(root, file))

cdm_filesdataframe = pd.DataFrame(cdm_files)
cdm_filesdataframe.rename(columns = { 0 :'Directory Path'}, inplace = True)

您可以使用正则表达式在每个.cdm 文件中查找ID 属性(或者lxml 包应该更好)。我还将 os.walk 替换为 pathlib.glob。这里的代码:

import re
import pathlib

root_dir = pathlib.Path(r'\the\path')

data = []
for cdmfile in root_dir.glob('**/*.cdm'):
    with open('powerdesigner.cdm') as cdm:
        # skip first line: <?xml ...?>
        next(cdm)

        # Read next line: <?PowerDesigner ...?>
        # if sre := re.search(r'ID="\{(?P<ID>[^\{]+)\}"', cdm.readline()):
        sre = re.search(r'ID="\{(?P<ID>[^\{]+)\}"', cdm.readline())
        if sre:
            data.append((sre.group('ID'), cdmfile))

df = pd.DataFrame(data, columns=['ID', 'FilePath'])