如何拆分标准输入数据?Python读取stdin数据的代码问题解决
问题与解决方案
场景说明
你已经通过以下代码读取了标准输入的所有行数据:
import sys data = sys.stdin.readlines() l = len(data)
输入格式规则为:首行包含两个数字n和m,后续m行每行包含四个数值x1、y1、x2、y2,示例输入如下:
1 0 2 2 0 0 1 1 0 1 1 0
你尝试的代码无法正常运行:
for _ in range(l): n, m = map(int, data.readline().split()) some_list = [] for _ in range(m): x1, y1, x2, y2 = map(int, data.readline().split()) some_list.append([x1, y1, x2, y2]) some_function_with_given_part_of_data()
问题原因
data是readlines()返回的字符串列表,它没有readline()方法——readline()是文件对象的专属方法。你需要直接操作这个列表的元素,而不是调用不存在的方法。
正确实现方式
方式一:索引指针遍历(直观可控)
import sys data = sys.stdin.readlines() ptr = 0 # 用指针追踪当前处理到的行索引 while ptr < len(data): # 读取首行的n和m,先strip去掉换行和空格 n, m = map(int, data[ptr].strip().split()) ptr += 1 some_list = [] # 读取后续m行坐标 for _ in range(m): if ptr >= len(data): break # 防止输入数据行数不足导致索引越界 coords = list(map(int, data[ptr].strip().split())) x1, y1, x2, y2 = coords some_list.append([x1, y1, x2, y2]) ptr += 1 # 传入数据调用处理函数 some_function_with_given_part_of_data(n, some_list)
方式二:迭代器方式(简洁高效)
把列表转成迭代器,用next()逐个取行,不用手动维护索引:
import sys lines_iter = iter(sys.stdin.readlines()) while True: try: # 获取首行,跳过空行 line = next(lines_iter).strip() while not line: line = next(lines_iter).strip() n, m = map(int, line.split()) except StopIteration: break # 没有更多数据,退出循环 some_list = [] for _ in range(m): try: coords = list(map(int, next(lines_iter).strip().split())) some_list.append(coords) except StopIteration: break # 数据不足时停止读取 some_function_with_given_part_of_data(n, some_list)
注意事项
- 处理每行时用
strip()去除换行符和首尾空格,避免拆分出空字符串导致转换错误 - 加入边界判断(比如
ptr >= len(data)或StopIteration捕获),能避免输入格式不规范时程序崩溃 - 如果能确保输入数据完全符合规则,可以简化边界判断,但保留会让代码更健壮
内容的提问来源于stack exchange,提问作者niico
相关产品推荐
相关产品推荐

