Python读取文本文件中多个数组报错,需解决以获取预期输出
解决读取Test.txt中numpy数组字符串的语法错误问题
问题背景
尝试读取Test.txt中存储的多个numpy数组字符串,原代码运行时触发语法错误,无法获取预期输出。
原代码
import re import numpy as np import ast with open('Test.txt') as f: s = f.readlines() #print(s) s = ' '.join(s) s = re.findall("\((\[[\w\W]*\])\)",s) s=ast.literal_eval(s[0]) s=np.array(s) print([s])
Test.txt内容
[array([[1.7], [2.8], [3.9], [5.2]])] [array([[2.1], [8.7], [6.9], [4.9]])]
报错信息
line 4 [5.2]])] ^ SyntaxError: unmatched ')'
错误原因
- 正则表达式
"\((\[[\w\W]*\])\)"采用贪婪匹配,会将整个文件内容作为单个匹配项,导致括号结构不匹配,触发语法错误。 ast.literal_eval仅能解析原生Python字面量,无法识别numpy的array()语法,后续也无法正确解析数组内容。
解决方案
方案一:使用eval解析(适用于可信文件)
直接利用eval解析每个完整的数组块,同时传入numpy的array函数作为上下文,确保能识别数组语法:
import numpy as np with open('Test.txt') as f: # 读取所有非空行 lines = [line.strip() for line in f if line.strip()] array_blocks = [] current_block = [] # 合并每个完整的数组块 for line in lines: current_block.append(line) # 判断当前块是否结束 if line.endswith('])]'): array_blocks.append(' '.join(current_block)) current_block = [] # 解析每个数组块 result = [] for block in array_blocks: # 传入array=np.array作为上下文,让eval识别array函数 arr = eval(block, {'array': np.array}) result.append(arr) # 输出预期格式的结果 for item in result: print(item)
方案二:提取数值重构数组(无安全风险)
通过正则提取数组中的数值部分,再重新构建numpy数组,避免eval带来的安全隐患:
import re import numpy as np with open('Test.txt') as f: content = f.read() # 匹配每个数组内的二维数值列表 num_matches = re.findall(r'\[\[.*?\]\]', content, re.DOTALL) result = [] for match in num_matches: # 将字符串转为列表后构建numpy数组 num_list = eval(match) np_arr = np.array(num_list) # 包装成原格式的列表结构 result.append([np_arr]) # 输出结果 for item in result: print(item)
内容的提问来源于stack exchange,提问作者user19862793
相关产品推荐
相关产品推荐

