使用python创建一个字符串数组,其中包含文件中的文本组合

使用python创建一个字符串数组,其中包含文件中的文本组合,python,arrays,string,Python,Arrays,String,我对python脚本编写相当陌生,正在为以下任务寻找解决方案: 打开文本文件 创建由文本(名称+属性)组成的字符串数组,这些字符串必须在文本文件中找到(多行) 文件摘录如下: **HM_comp_by_property "4512_solid" 34 *SOLID SECTION, ELSET=flange2, MATERIAL=WN1.4512 **HM_comp_by_property "4512_2_0mm" 7 *SHELL SECTION, ELSET=ccc_pin ,

我对python脚本编写相当陌生,正在为以下任务寻找解决方案:

  • 打开文本文件
  • 创建由文本(名称+属性)组成的字符串数组,这些字符串必须在文本文件中找到(多行)
  • 文件摘录如下:

    **HM_comp_by_property "4512_solid"    34
    *SOLID SECTION, ELSET=flange2, MATERIAL=WN1.4512
    **HM_comp_by_property "4512_2_0mm"     7
    *SHELL SECTION, ELSET=ccc_pin , TEMPERATURE =        3, MATERIAL=WN1.4512
    2.0       ,         3
    
    最后必须创建一个数组,由“elset”名称及其材质的不同组合组成:

    flange2    WN1.4512
    ccc_pin    WN1.4512
    
    希望你能给我一些建议让我开始。我不希望有一个完整的解决方案,一些指导原则会很好:-)


    提前谢谢

    因为它是一个单行程序,所以有一种方法可以做到:

    with open('input_file.txt') as f:
       array = [x for x in [re.findall(r'(?:ELSET|MATERIAL)=([^\s,]*)', line) for line in f] if x]
    
    实质上,

    • 打开文件
    • 一次读一行:
      用于f中的行
    • 查找您需要的数据:
      re.findall(r'(?:ELSET | MATERIAL)=([^\s,]*),line)
    • 清除空白条目:
      [x代表x在[…]如果x]
    您可能对
    re.findall()
    步骤感兴趣:

    • re.findall
      返回所有匹配项的数组
    • 第一个参数是模式:
      • r'
        ——使用原始字符串,不
        \\
        愚蠢
      • (?:ELSET | MATERIAL)
        -匹配这些关键字,但不要记住它们
      • ([^\s,]*)
        -匹配一系列非空白、非逗号字符,并记住它们
      • (?:ELSET | MATERIAL)=([^\s,]*)
        -匹配文本,如
        ELSET=foo.bar
        并记住
        foo.bar
    因此,整个过程逐行搜索我们关心的两种模式,并返回那些
    TYPE=VAL
    对的值数组。

    未测试。适用于提供的示例。我假设你真正想要的是一本以ELSET为键的字典

    import re   
    
    fp = open("input.txt")
    
    ans = {}     // Dictionary to store the values
    for line in fp:
        if re.match("\*[^\*]", line):    // If the line starts with only one *
            elset = re.findall(".*ELSET=([^\s,]*)", line)[0]
            material = re.findall(".*MATERIAL=([^\s,]*)", line)[0]
    
            ans[elset] = material
    
    print ans
    
    import re
    
    def _search_line_for_key_value (key, line):
        key_finder = re.finditer(key + r'\s*=', line)
        try:
            first_match = next(key_finder)
        except StopIteration:
            return None
        value = re.match(r'\s*([^,\s]+)', line[first_match.end():])
        if not value:
            raise ValueError('A line was encountered with an invalid %s value' % key)
        try:
            next(key_finder)
        except StopIteration:
            return value.group(1)
        else:
            raise ValueError('A line was encountered with more than one %s value' % key)
    
    def get_elset_material_dict (filename):
        results = {}
        for line in open(filename):
            elset = _search_line_for_key_value('ELSET', line)
            if elset is not None:
                results[elset] = _search_line_for_key_value('MATERIAL', line)
        return results
    

    假设格式相当一致,这似乎是一个相当简单的捕获正则表达式的例子(假设您在其他语言中使用过正则表达式,也许?)以及人们会建议的其他字符串操作。每个ELSET名称可能不止一个值吗?我想知道你真正的意思是你需要的是Python字典()?但这需要每个值上有一个“键”。也许我想太多了,你用了“数组”这个词?这是你代码中的dict/类吗?如果是,请使用
    pickle
    加载/保存数据。感谢您的快速回复!当两个关键字都在同一行中时,是否可以只使用行数据?在其他行中,关键字可能只单独出现。非常感谢。这很有魅力!我唯一改变的是它处理没有发现任何材料的情况的方式。该条目将被删除。