如何将文件内的点列表转换为两个独立的x、y坐标数组?
问题背景
data.txt存储了集合格式的二维点数据,内容为:{(1.1,2.2),(3.3,4.4),(5.5,6.6),(7.7,8.8),(9.9,10),(11,12)}- 初始读取代码存在两个明显问题:
- 连续两次调用
f.read(),第一次读取完成后文件指针已经移到内容末尾,第二次读取拿到的是空值 - 没有实现坐标解析、拆分x/y数组的逻辑
- 连续两次调用
- 预期输出效果:
>>> print(x) [1.1 3.3 5.5 7.7 9.9 11] >>> print(y) [2.2 4.4 6.6 8.8 10 12]
实现代码
推荐用Python标准库ast的literal_eval做安全解析,避免直接用eval执行恶意代码的风险,同时用上下文管理器自动处理文件关闭,避免资源泄漏:
import ast # 读取文件内容 with open("data.txt", "r", encoding="utf-8") as f: file_content = f.read().strip() # 安全解析为Python集合对象 points = ast.literal_eval(file_content) # 拆分x、y坐标 x = [p[0] for p in points] y = [p[1] for p in points] # 适配示例的无逗号空格分隔打印格式 def format_print(arr): print(f"[{' '.join(str(num) for num in arr)}]") format_print(x) format_print(y)
补充说明
- 如果你需要严格保证坐标顺序和文件内书写顺序一致,不要用集合解析的方案(Python3.7以下版本集合不保证插入顺序),可以直接用字符串处理的方式解析:
with open("data.txt", "r", encoding="utf-8") as f: file_content = f.read().strip() # 字符串切割提取坐标 raw_tuples = file_content.strip("{}").split("),(") x = [] y = [] for item in raw_tuples: px, py = item.strip("()").split(",") # 自动识别整数、浮点数类型 x.append(float(px) if "." in px else int(px)) y.append(float(py) if "." in py else int(py))
- 如果你本身就用NumPy做数值计算,直接把列表转成NumPy数组,原生打印效果就和示例完全一致:
import numpy as np x = np.array(x) y = np.array(y) print(x) # 输出 [ 1.1 3.3 5.5 7.7 9.9 11. ] print(y) # 输出 [ 2.2 4.4 6.6 8.8 10. 12. ]
内容的提问来源于stack exchange,提问作者challote
相关产品推荐
相关产品推荐

