如何在Python 3.x中识别并存储格式化文本文件的变量与数据?
嘿,别担心,好久不用Python手生太正常了!我来给你分享几个实用的思路,帮你把那段文本里的数据解析成你想要的格式~
首先,你已经成功提取了<THING1>到</THING1>之间的内容,这一步很棒!接下来的核心就是把这段长字符串里的变量拆分出来,再转换成对应的数据类型。我给你两种常用的解决方案:
方案1:按行/分隔符拆分后逐行处理
如果你的目标文本里每个变量是单独一行(或者用\#分隔),可以先把字符串拆分成一个个变量行,再逐个处理:
# 假设你已经提取好的t1字符串 t1 = '''<THING1> var1 = 0 var2 = "0.0 100.0 0.0" var3 = "IDENTIFYING_WORD" var4 = 2 </THING1>''' # 第一步:清理字符串,拆分出有效变量行 # splitlines()自动处理各种换行符,strip()去掉每行的空格,过滤掉空行和标签行 lines = [line.strip() for line in t1.splitlines() if line.strip() not in ('<THING1>', '')] # 第二步:初始化字典存储结果 parsed_data = {} # 第三步:遍历每行,解析变量 for line in lines: # 按=分割键和值(只分割1次,避免值里出现=的情况) key, value = [part.strip() for part in line.split('=', 1)] if key in ('var1', 'var4'): # 转成整数 parsed_data[key] = int(value) elif key == 'var2': # 去掉引号,按空格拆分数字,转成浮点数列表(要整数就用int(num)) num_str = value.strip('"') parsed_data[key] = [float(num) for num in num_str.split()] elif key == 'var3': # 去掉引号保留字符串 parsed_data[key] = value.strip('"') # 看看结果 print(parsed_data['var1']) # 0 print(parsed_data['var2']) # [0.0, 100.0, 0.0] print(parsed_data['var3']) # IDENTIFYING_WORD print(parsed_data['var4']) # 2
如果你的原始文本里变量是用\#分隔的(比如你示例里的\ var1 = 0 \# var2 = ...),只需要把拆分方式改成split('\#')就行,逻辑和上面一样。
方案2:用正则表达式直接匹配(适合格式固定的情况)
如果你的文本格式非常规整,用正则表达式可以更直接地提取每个变量的值,不需要拆分行:
import re # 还是用你提取好的t1字符串 t1 = '''<THING1> \ var1 = 0 \# var2 = "0.0 100.0 0.0" \# var3 = "IDENTIFYING_WORD" \# var4 = 2 \# </THING1>''' # 匹配var1:提取等号后的数字 var1 = int(re.search(r'var1\s*=\s*(\d+)', t1).group(1)) # 匹配var2:提取引号内的数字字符串,再转成列表 var2_str = re.search(r'var2\s*=\s*"([\d\s.]+)"', t1).group(1) var2 = [float(num) for num in var2_str.split()] # 匹配var3:提取引号内的字符串 var3 = re.search(r'var3\s*=\s*"([^"]+)"', t1).group(1) # 匹配var4:提取等号后的数字 var4 = int(re.search(r'var4\s*=\s*(\d+)', t1).group(1)) # 输出结果 print(var1) # 0 print(var2) # [0.0, 100.0, 0.0] print(var3) # IDENTIFYING_WORD print(var4) # 2
为什么你之前用index找换行没成功?
因为index('\n')只会找第一个换行符,后续的切片逻辑很容易因为字符串结构的细微变化出错。用splitlines()或者正则表达式会更可靠,它们能自动处理各种换行符(比如\n、\r\n),也不用手动计算索引位置。
两种方案都能实现你的需求,选哪种取决于你的文本格式是否固定:如果格式可能有小变动,方案1更灵活;如果格式完全固定,方案2更简洁。
内容的提问来源于stack exchange,提问作者Lou
相关产品推荐
相关产品推荐

