csv操作

问kimi的问题(在kimi网站)

对于如下的csv文件:

number,college,foundation,elective,related_electives,persist,obtain
1,10,零基础,否,没学过,否,简单的编程,编程的原理,思考的逻辑
2,3,零基础,否,数据库与数据挖掘,是,对编程软件的熟练应用
3,4,零基础,否,flash,是,收获编程基础
4,16,零基础,否,无,是,数据思维及相关基础知识操作
5,6,零基础,否,无,是,Python语言使用方法

写python代码,统计第2列值为指定某个值的行数

kimi的回复



你可以使用 Python 的 csv 模块来读取文件,并统计第 2 列(即 college 列)等于某个指定值的行数。下面是一个完整的示例代码:

import csv

def count_rows_by_college(csv_file, target_college):
    count = 0
    with open(csv_file, newline='', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            if row['college'] == str(target_college):
                count += 1
    return count

# 示例用法
csv_path = 'your_file.csv'  # 替换为你的CSV文件路径
target = 3  # 你想统计的college值
result = count_rows_by_college(csv_path, target)
print(f"college为 {target} 的行数为:{result}")

说明:

  • 使用 csv.DictReader 可以按列名访问数据,避免硬编码列索引。
  • 确保 target_college 是字符串或整数,视你传入的值而定。

你可以根据需要修改 target 的值来统计不同的学院编号。

上面代码是完全正确的,如果你不太明白,可以让kimi来解释代码,如:

问kimi

请详细介绍下下面的代码:
import csv

def count_rows_by_college(csv_file, target_college):
    count = 0
    with open(csv_file, newline='', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            if row['college'] == str(target_college):
                count += 1
    return count

kimi的回复,解释的非常详细,还指导你如何扩展



下面把这段代码逐行拆开,告诉你它在做什么、为什么要这么写,以及可能踩的坑。读完你应该能随意改写成统计任意列、任意值、甚至任意条件的版本。


1. 导入模块

import csv
  • Python 标准库自带,无需额外安装。
  • 提供了两大“读取器”:
    csv.reader → 按“列表”返回每一行,靠索引取列。
    csv.DictReader → 按“字典”返回每一行,列名就是 key。
    这里用 DictReader,代码可读性高,列顺序变化也不影响。

2. 函数定义

def count_rows_by_college(csv_file, target_college):
  • 把“统计”逻辑封装成函数,方便复用与单元测试。
  • 两个形参:
    csv_file:文件路径,字符串。
    target_college:想统计的学院编号,用户可能传 int 也可能传 str

3. 初始化计数器

    count = 0
  • 最简单直接的计数器,满足一次遍历即可搞定。

4. 打开文件

    with open(csv_file, newline='', encoding='utf-8') as file:
  • with 语句保证文件描述符自动关闭,即使中途报错。
  • newline=''csv 模块官方最佳实践
    – 防止在 Windows 下把 \r\n 解析成两行。
    – 防止出现多余的空行。
  • encoding='utf-8' 让中文路径/内容不会炸;如果你的文件是 GBK,就改成 encoding='gbk'

5. 创建 DictReader

        reader = csv.DictReader(file)
  • 第一行会自动被当成“表头”,返回的每一行都是 OrderedDict(Python 3.7+ 就是普通 dict)。
  • 例如第一行数据会被解析成
    {'number': '1', 'college': '10', 'foundation': '零基础', ...}
    
  • 列名里有空格或特殊字符也能用,只要 key 匹配即可。

6. 逐行迭代

        for row in reader:
  • 惰性迭代,不占内存;再大文件也扛得住。
  • 每次循环 row 就是一个字典。

7. 条件判断

            if row['college'] == str(target_college):
  • row['college'] 一定是字符串(csv 里所有单元格都是 str)。
  • 因此把 target_college 也强转成 str,避免 3 == '3'False 的坑。
  • 如果你想“模糊匹配”可以改成
    if str(target_college) in row['college']:
    
    或者正则、大小写忽略等。

8. 计数

                count += 1
  • 满足条件就把计数器 +1。

9. 返回结果

    return count
  • 函数外部拿到一个整数,可以直接打印、写入报表、继续运算。

10. 一个完整调用示例

if __name__ == '__main__':
    n = count_rows_by_college('data.csv', 3)
    print(f'college = 3 的行数:{n}')
  • if __name__ == '__main__' 保证被 import 时不会自动跑测试代码。

11. 常见变形

需求 改动点
统计任意列 row[col_name] == str(target)
多条件 if row['college'] == '3' and row['foundation'] == '零基础':
不区分大小写 if row['college'].lower() == str(target_college).lower()
统计重复值并排序 collections.Counter
大文件极速版 在生成器里累加,不存列表,依旧流式

12. 性能提示

  • 几十万行以内直接暴力循环即可。
  • 百万行以上且需要反复多次统计,可以:
    – 一次性读成 pandas.DataFrame,然后 df.query(...)value_counts()
    – 或者先拼成 SQL 扔进 SQLite,再做索引。

13. 错误排查 checklist

现象 可能原因
返回永远是 0 文件路径错 / 列名写错 / 大小写不一致
报错 UnicodeDecodeError 文件编码不是 utf-8,改成 gbk 或 latin-1
行数比预期多一倍 忘记加 newline='' 且在 Windows 下

把上面这些点吃透,这段 10 行的小函数你就可以随意扩展成“万能统计脚本”了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容