查看: 209|回复: 0

Python统计文本文件指定区间数据量:循环与Pandas实现

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
Python 统计文本文件指定区间数据量时,核心流程是读取文件、定义区间、筛选计数、输出结果。常见数据格式是每行一个数值,目标区间可能是 [455120,455140]、[455140,455160]、[455160,455180]、[455180,455200] 等连续区间。下面按基础循环实现和 Pandas 分箱实现两部分说明,并说明边界条件和最后一个 else 容易出错的地方。

一、基础循环:读取、判断、计数
先用 load_numbers(file) 读取文件,把每行转换为 float。原文使用 readlines() 逐行读取,再追加到列表。这里要注意:如果文件中有表头、空行或非数值内容,float(line) 会抛 ValueError,需要提前清洗或加 try/except。基础实现如下:
  1. def load_numbers(file):
  2.     numbers = []
  3.     with open(file, 'r') as f:
  4.         for line in f.readlines():
  5.             numbers.append(float(line))
  6.     return numbers
  7. if __name__ == '__main__':
  8.     numbers = load_numbers('XXX.txt')
  9.     min1, max1 = 455120, 455140
  10.     min2, max2 = 455140, 455160
  11.     min3, max3 = 455160, 455180
  12.     min4, max4 = 455180, 455200
  13.     i = j = k = l = 0
  14.     for val in numbers:
  15.         # > 和 < 表示不包含边界;若要包含上下限,改成 >= 和 <=
  16.         if val > min1 and val < max1:
  17.             i += 1
  18.         elif val > min2 and val < max2:
  19.             j += 1
  20.         elif val > min3 and val < max3:
  21.             k += 1
  22.         else:
  23.             l += 1
  24.     with open('result.txt', 'w') as f:
  25.         f.write('[%d,%d]:%d\n' % (min1, max1, i))
  26.         f.write('[%d,%d]:%d\n' % (min2, max2, j))
  27.         f.write('[%d,%d]:%d\n' % (min3, max3, k))
  28.         f.write('[%d,%d]:%d\n' % (min4, max4, l))
  29.     print('done.')
复制代码

这段代码把区间判断写成 if/elif 链。前三个区间用大于下限且小于上限的条件,最后一个区间直接用 else 承接。如果数据严格落在四个区间内,且不包含边界,结果没有问题;但如果数据可能小于 455120、大于 455200,或者恰好等于 455140、455160、455180 等边界值,它们也会被计入 l,导致第四个区间统计偏大。更严谨的写法是把最后一个分支也写成明确条件:
  1. elif val > min4 and val < max4:
  2.             l += 1
复制代码

如果还需要统计区间外数据,可以再增加一个计数器。边界是否需要包含,必须根据业务定义提前确定:> 和 < 是开区间,>= 和 <= 是闭区间。对于连续区间,常采用“左闭右开”,例如 val >= 下限 and val < 上限,避免边界值被重复统计。

二、Pandas 与 pd.cut:一次性统计多个区间
当数据量较大,或者数据已经在 CSV/Excel 中,用 Pandas 的 pd.cut 分箱会更简洁。它可以把一列数值按 bins 切分,再用 value_counts 汇总。示例:
  1. import pandas as pd
  2. df = pd.read_csv('data.csv', header=None, names=['value'])
  3. bins = [455120, 455140, 455160, 455180, 455200]
  4. labels = ['455120-455140', '455140-455160', '455160-455180', '455180-455200']
  5. df['range'] = pd.cut(df['value'], bins=bins, labels=labels, right=False)
  6. count = df['range'].value_counts().sort_index()
  7. 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 的边界处理,以及数据读取时的类型转换。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-16 13:10 , Processed in 0.020352 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部