Python 统计文本文件指定区间数据量时,核心流程是读取文件、定义区间、筛选计数、输出结果。常见数据格式是每行一个数值,目标区间可能是 [455120,455140]、[455140,455160]、[455160,455180]、[455180,455200] 等连续区间。下面按基础循环实现和 Pandas 分箱实现两部分说明,并说明边界条件和最后一个 else 容易出错的地方。
一、基础循环:读取、判断、计数
先用 load_numbers(file) 读取文件,把每行转换为 float。原文使用 readlines() 逐行读取,再追加到列表。这里要注意:如果文件中有表头、空行或非数值内容,float(line) 会抛 ValueError,需要提前清洗或加 try/except。基础实现如下:
- def load_numbers(file):
- numbers = []
- with open(file, 'r') as f:
- for line in f.readlines():
- numbers.append(float(line))
- return numbers
- if __name__ == '__main__':
- numbers = load_numbers('XXX.txt')
- min1, max1 = 455120, 455140
- min2, max2 = 455140, 455160
- min3, max3 = 455160, 455180
- min4, max4 = 455180, 455200
- i = j = k = l = 0
- for val in numbers:
- # > 和 < 表示不包含边界;若要包含上下限,改成 >= 和 <=
- if val > min1 and val < max1:
- i += 1
- elif val > min2 and val < max2:
- j += 1
- elif val > min3 and val < max3:
- k += 1
- else:
- l += 1
- with open('result.txt', 'w') as f:
- f.write('[%d,%d]:%d\n' % (min1, max1, i))
- f.write('[%d,%d]:%d\n' % (min2, max2, j))
- f.write('[%d,%d]:%d\n' % (min3, max3, k))
- f.write('[%d,%d]:%d\n' % (min4, max4, l))
- print('done.')
复制代码
这段代码把区间判断写成 if/elif 链。前三个区间用大于下限且小于上限的条件,最后一个区间直接用 else 承接。如果数据严格落在四个区间内,且不包含边界,结果没有问题;但如果数据可能小于 455120、大于 455200,或者恰好等于 455140、455160、455180 等边界值,它们也会被计入 l,导致第四个区间统计偏大。更严谨的写法是把最后一个分支也写成明确条件:
- elif val > min4 and val < max4:
- l += 1
复制代码
如果还需要统计区间外数据,可以再增加一个计数器。边界是否需要包含,必须根据业务定义提前确定:> 和 < 是开区间,>= 和 <= 是闭区间。对于连续区间,常采用“左闭右开”,例如 val >= 下限 and val < 上限,避免边界值被重复统计。
二、Pandas 与 pd.cut:一次性统计多个区间
当数据量较大,或者数据已经在 CSV/Excel 中,用 Pandas 的 pd.cut 分箱会更简洁。它可以把一列数值按 bins 切分,再用 value_counts 汇总。示例:
- import pandas as pd
- df = pd.read_csv('data.csv', header=None, names=['value'])
- bins = [455120, 455140, 455160, 455180, 455200]
- labels = ['455120-455140', '455140-455160', '455160-455180', '455180-455200']
- df['range'] = pd.cut(df['value'], bins=bins, labels=labels, right=False)
- count = df['range'].value_counts().sort_index()
- print(count)
复制代码
pd.cut 的 right 参数决定区间开闭:默认 right=True,表示左开右闭;传入 right=False 后变成左闭右开。上面 bins 有 5 个边界,因此会得到 4 个区间。如果数据是 Excel,只需把读取方式换成 pd.read_excel('文件.xlsx'),后续分箱和统计逻辑不变。相比手写循环,Pandas 方式更适合数据量大、区间多、需要复用 DataFrame 的场景;手写循环则适合小文件、无第三方依赖或需要嵌入简单脚本的场景。
三、排查与结果输出
如果统计结果不符合预期,优先检查三处:一是文件每行是否都能转换为数值;二是条件中的 >、<、>=、<= 是否与业务边界一致;三是最后一个 else 是否把区间外数据也计入了目标区间。原文将结果写入 result.txt,并用 print('done.') 提示结束。实际使用时,也可以在写入前对计数结果做一次总和校验:各区间计数之和应当等于参与统计的数据总数,若不等,说明边界或过滤逻辑存在遗漏。
总结:统计数据文件特定区间数据量,基础方案是 load_numbers 读取每行数值,再用 if/elif 遍历计数;高效方案是 Pandas + pd.cut 分箱后 value_counts。关键不在循环本身,而在区间开闭、最后一个 else 的边界处理,以及数据读取时的类型转换。 |