使用python创建一个字符串数组,其中包含文件中的文本组合
我对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 ,
**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
加载/保存数据。感谢您的快速回复!当两个关键字都在同一行中时,是否可以只使用行数据?在其他行中,关键字可能只单独出现。非常感谢。这很有魅力!我唯一改变的是它处理没有发现任何材料的情况的方式。该条目将被删除。