You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何每100步读取两个数据文件?Python open用法问题

问题分析与解决办法

你遇到的问题根源在于Python中and运算符处理两个range对象的方式——它并不是把两个范围合并,而是做布尔逻辑判断:

非空的range对象在布尔语境下会被视为True,所以range(...) and range(...)会直接返回第二个range对象,这就导致你的循环只遍历了range(2, 2002, 100)里的数值,自然只能读取对应文件。

下面给你几种可行的解决思路:


方法1:用itertools.chain合并两个范围

itertools.chain可以把多个可迭代对象(比如两个range)拼接成一个连续的迭代器,不需要额外生成列表,效率很高:

import itertools
import numpy as np

# 合并两个range,依次遍历1,101,...1901和2,102,...2002
for t in itertools.chain(range(1, 2001, 100), range(2, 2002, 100)):
    # 用with语句自动管理文件,避免手动close可能出现的问题
    with open(f"{t}.dat", 'r') as f:
        y = np.array([[float(data) for data in line.split()] for line in f.readlines()])
    # 这里可以添加对y的后续处理(比如存入列表、计算等)

如果希望遍历顺序和你给出的文件名顺序完全一致(1,2,101,102,201,202...),可以改用循环生成文件名列表:

import numpy as np

file_numbers = []
# 从0开始,每次加100,生成每组的两个文件名
for base in range(0, 2001, 100):
    file_numbers.append(base + 1)
    file_numbers.append(base + 2)

for t in file_numbers:
    with open(f"{t}.dat", 'r') as f:
        y = np.array([[float(data) for data in line.split()] for line in f.readlines()])

方法2:直接合并两个range的列表

如果数据量不大,也可以直接把两个range转换成列表后相加,写法更直观:

import numpy as np

file_numbers = list(range(1, 2001, 100)) + list(range(2, 2002, 100))
# 若需要按1,2,101,102的顺序,记得对file_numbers排序:
# file_numbers.sort()

for t in file_numbers:
    with open(f"{t}.dat", 'r') as f:
        y = np.array([[float(data) for data in line.split()] for line in f.readlines()])

额外提醒:使用with语句打开文件是Python的最佳实践,它会在代码块结束后自动关闭文件,避免因异常或忘记调用close()导致的资源泄漏问题。

内容的提问来源于stack exchange,提问作者John Paul Qiang Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:13:00