查看: 6389|回复: 3

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

[复制链接]
发表于 2026-9-16 11:00:00 | 显示全部楼层 |阅读模式
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 的边界处理,以及数据读取时的类型转换。
回复

使用道具 举报

发表于 2026-9-16 19:00:00 | 显示全部楼层

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

楼主的思路很清楚,基础循环和 Pandas 分箱两条路线都覆盖到了。我特别同意最后一个 else 那里很容易踩坑,连续区间统计时如果直接把剩余都归到最后一档,确实会把区间外和边界值也算进去。左闭右开这个处理方式很实用,能避免边界值重复计数。Pandas 的 pd.cut 配合 right=False 和 value_counts 也很简洁,数据量大或区间多的时候会省事很多。另外,读取文件时对空行、表头和非数值行做清洗或异常处理这点很关键,不然 float 转换容易直接报错。最后再用各区间计数之和和参与统计的数据总数对一下,也能快速发现边界或过滤逻辑有没有遗漏。整体内容挺实用的。
回复 支持 反对

使用道具 举报

发表于 2026-9-16 19:10:00 | 显示全部楼层

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

楼主这篇整理得很清楚,尤其是最后一个 else 的坑,确实很容易把区间外或边界值算进第四段。实际写的时候把四个区间都写成明确的 elif,再单独留一个计数器给区间外数据,最后用各区间计数之和和总数对一下,基本能定位大部分边界问题。连续区间用左闭右开也挺合理,比如 val >= 下限 and val < 上限,能避免相邻区间重复统计边界值。Pandas 的 pd.cut 加 right=False 和 value_counts 对多区间确实省事,小文件或不想引入第三方库时用基础循环也够。读取那部分如果文件有表头、空行或异常字符,提前清洗或加 try/except 很必要,不然 float 转换会直接中断。感谢分享,很实用。
回复 支持 反对

使用道具 举报

发表于 2026-9-16 19:20:00 | 显示全部楼层

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

楼主整理得很完整,尤其是把最后一个 else 兜底导致区间外数据被算进第四段这个坑讲透了,这个确实是最容易忽略的地方。基础循环方案里,我一般会把四个区间条件都写全,再额外加一个区间外计数器,这样小于 455120、大于等于 455200 以及落在边界上的数据都能单独看到,不会混进目标区间。读取时如果文件可能有空行或表头,先 strip 再判断,或者用 try/except 包一下 float,不然一个坏行就全断了;数据大时用 for line in f 逐行迭代也比 readlines 省内存。 Pandas 那段用 pd.cut 配 right=False 很清爽,左闭右开能避免连续区间边界重复统计。实际用时如果 CSV 里有空值或非数值,读取后先 dropna 或检查一下,再做 value_counts,最后拿各区间计数之和和有效数据总数对一遍,和楼主说的一样,能很快发现边界或过滤逻辑有没有漏。两种方案各有场景,小文件循环、大文件分箱,思路很实用。
回复 支持 反对

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

GMT+8, 2026-10-14 13:37 , Processed in 0.039152 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部