当前位置:   article > 正文

Python读写csv文件_csv.reader

csv.reader

简介

通过Python内置csv模块,可以读取和写入CSV(逗号分隔值)文件。

CSV是一种常见的文件格式,通常用于存储表格数据,每行数据由逗号分隔,每个字段可以用引号括起来。

测试文件内容如下

列号,年龄,姓名,性别,爱好
1,23,关羽,男,骑车
2,45,李四,男,打篮球
3,25,王美丽,女,织毛衣
4,76,关大头,男,抠脚
5,28,淑女,女,旅游

目录

1. 读取 csv 文件

1.1. 读取全部内容

1.2. 固定读取第n行

1.3. 范围读取第n-m行

1.4. 读取最后一行

1.5. 跳过第n-m行

1.6. 固定读取第n列

1.7. 范围读取第n-m列

1.8. 跳过第n-m列

2. 写入 csv 文件

2.1. 追加内容但最后

2.2. 指定第n行写入内容

2.3. 指定n行m列追加内容

2.4. 修改第n行m列内容

2.5. 修改符合要求的值

3. 字典式读取和写入


                            

1. 读取 csv 文件

1.1. 读取全部内容

创建一个读取的对象,遍历所有行

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 遍历所有行
  7. for row in reader:
  8. print(row)

                            

1.2. 固定读取第n行

由于 csv 模块不能直接指定第n行,可以通过跳过的方式读取

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 循环文件前2行
  7. for _ in range(2):
  8. next(reader) # 跳过前2行
  9. # 读取下一行,也就是第3行
  10. row_3 = next(reader)
  11. print(row_3)

                            

可以通过内置方法 readlines 读取指定行

  1. with open(r'E:\test.csv', 'r', encoding='utf-8') as f:
  2. # 通过索引读取第3行
  3. lines = f.readlines()[2]
  4. print(lines )

                            

1.3. 范围读取第n-m行

csv 模块不能直接指定第n行,同样通过跳过的方式读取

读取第 3 - 5 行

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 循环文件前2行
  7. for _ in range(2):
  8. next(reader) # 跳过前2行
  9. # 循环读取下n行
  10. for _ in range(3): #遍历3次
  11. row = next(reader)
  12. print(row)

                            

直接使用内置方法 readlines 读取 3-5 行

  1. with open(r'E:\test.csv', 'r', encoding='utf-8') as f:
  2. # 使用索引读取第3-5行
  3. lines = f.readlines()[2:5]
  4. # 直接打印3-5行
  5. print(lines)
  6. # 删除换行符,遍历读取
  7. for line in lines:
  8. cleaned_line = line.strip() # 去除行尾换行符
  9. print(cleaned_line)

                            

1.4. 读取最后一行

csv 模块中没有直接读取最后一行的方法,通过循环读取全部内容,持续更新赋值给变量,那么最后变量得到的结果就是最后一行

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 循环赋值
  7. for row in reader:
  8. last_row = row
  9. # 赋值的最后一行就是最终内容
  10. print(last_row)

                            

直接通过内置函数 readlines 读取最后一行

  1. with open(r'E:\test.csv', 'r', encoding='utf-8') as f:
  2. # 读取最后一行
  3. lines = f.readlines()[-1]
  4. print(lines)

                            

1.5. 跳过第n-m行

通过内置函数 enumerate 输出的序号来判断跳过第 2-3 行

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 指定迭代序号,序号从1开始
  7. for num,row in enumerate(reader, 1):
  8. # 如果序号为2-3,那么跳出当前循环
  9. if 2 <= num <= 3:
  10. continue
  11. # 打印序号和值
  12. print(num,row)

                            

跳过最后一行(将csv阅读对象转换为列表)

  • 如果CSV文件非常大,将其读取到内存中作为列表可能会导致内存占用过高,尤其是在处理大型CSV文件时,可能会影响程序的性能并导致内存不足错误。
  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 将csv对象转换为列表
  7. row_list = list(reader)
  8. # 遍历这个列表和行号
  9. for num,row in enumerate(row_list, 1):
  10. # 如果行号=总行数,跳出循环
  11. if num == len(row_list):
  12. break
  13. # 输出每行内容
  14. print(row)

                            

1.6. 固定读取第n列

通过索引读取第 3 列

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 遍历读取所有行
  7. for row in reader:
  8. # 判断长度大于3
  9. if len(row) >= 3:
  10. # 如果长度大于3,则通过索引读取第3列
  11. print(row[2])
  12. else:
  13. print('null')

                            

读取第1、2、4列

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 遍历读取所有行
  7. for row in reader:
  8. # 指定第1、2、4列
  9. print(row[0], row[1], row[3])

                            

读取最后 1 列 

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 遍历读取所有行
  7. for row in reader:
  8. # 通过索引读取最后1列
  9. print(row[-1])

                            

1.7. 范围读取第n-m列

通过索引读取第 2-4 列

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 遍历读取所有行
  7. for row in reader:
  8. # 通过索引读取第 2-4 列
  9. print(row[1:4])

                             

1.8. 跳过第n-m列

跳过第 2-3 列

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 遍历读取所有行
  7. for row in reader:
  8. # 跳过2-3列(读取1列和3列后面全部)
  9. print(row[0], *row[3:]) # *表示解包

                            

跳过最后一列

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
  4. # 创建csv阅读器对象
  5. reader = csv.reader(f)
  6. # 遍历读取所有行
  7. for row in reader:
  8. # 输出最后一列前面的所有列
  9. print(row[:-1])

                            

                            

2. 写入 csv 文件

2.1. 追加内容但最后

打开文件时,a表示追加,w表示覆盖

  1. import csv
  2. # w表示覆盖,a表示追加
  3. with open(r'E:\test.csv', 'a', newline='', encoding='utf-8-sig') as f:
  4. # 创建csv写入器对象
  5. writer = csv.writer(f)
  6. '''写入单行'''
  7. writer.writerow([]) # 如果前面有内容,先写入 一个空行
  8. writer.writerow([6, 13, '妲己', '女', '约会'])
  9. '''写入多行,关键字后面加s'''
  10. data = [
  11. [7, 49, '孙悟空', '男', '打架'],
  12. [8, 14, '猪八戒', '男', '吃饭'],
  13. [9, 20, '沙悟净', '男', '干活']
  14. ]
  15. writer.writerows(data)

                            

2.2. 指定第n行写入内容

方法:读取原内容 → 追加新内容 → 覆盖原内容

  1. import csv
  2. # 读取文件内容,转换为列表
  3. with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
  4. original_data = list(csv.reader(f))
  5. # 指定在第2行插入内容
  6. original_data.insert(1, [6, 13, '妲己', '女', '约会'])
  7. # 将新内容直接覆盖到原文件
  8. with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
  9. writer = csv.writer(f)
  10. writer.writerows(original_data)

                            

2.3. 指定n行m列追加内容

方法:读取原内容 → 追加新内容 → 覆盖原内容

  1. import csv
  2. # 读取文件内容,转换为列表
  3. with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
  4. original_data = list(csv.reader(f))
  5. # 指定在第2行、第3列后面追加内容
  6. original_data[1].insert(3, '临时1,临时2')
  7. # 将新内容直接覆盖到原文件
  8. with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
  9. writer = csv.writer(f)
  10. writer.writerows(original_data)

                            

2.4. 修改第n行m列内容

方法:读取原内容 → 修改内容 → 覆盖原内容

  1. import csv
  2. # 读取文件内容,转换为列表
  3. with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
  4. original_data = list(csv.reader(f))
  5. # 指定更新第2行3列的内容
  6. original_data[1][2] = '临时1'
  7. # 将新内容直接覆盖到原文件
  8. with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
  9. writer = csv.writer(f, quoting=csv.QUOTE_NONE, quotechar='', escapechar='\\')
  10. writer.writerows(original_data)

                            

2.5. 修改符合要求的值

方法:读取原内容 → 遍历每行 → 遍历行的每列 → 条件判断 → 修改内容 → 覆盖原内容

  1. import csv
  2. # 读取文件内容,转换为列表
  3. with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
  4. rows = list(csv.reader(f))
  5. # 遍历所有行
  6. for row in rows:
  7. # 遍历所有列索引和列的值
  8. for idx, col in enumerate(row):
  9. # 判断以 '李' 开头的字符
  10. if col.startswith("李"):
  11. row[idx] = "李**" # 修改内容
  12. # 将新内容直接覆盖到原文件
  13. with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
  14. writer = csv.writer(f, quoting=csv.QUOTE_NONE, quotechar='', escapechar='\\')
  15. writer.writerows(rows)

                            

                            

3. 字典式读取和写入

  • 通过键值对方式读取和写入内容。在csv文件中的键值对并不是以 key:value 的形式表现,而 key 表示标题(第1行),value 表示内容(第1行下面对应的内容)

通过键访问值

  1. import csv
  2. # 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
  3. with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as csvfile:
  4. # 创建csv阅读器对象
  5. reader = csv.DictReader(csvfile)
  6. # 遍历所有行
  7. for row in reader:
  8. # 可以通过键来访问每一列的内容
  9. print(row['姓名'], row['年龄'], row['性别'])

                             

写入数据

  1. import csv
  2. # 要写入CSV文件的键值对数据
  3. data = [
  4. {'姓名': 'new_姓名1', '年龄': 'new_年龄1', '性别': 'new_性别1'},
  5. {'姓名': 'new_姓名2', '年龄': 'new_年龄2', '性别': 'new_性别2'},
  6. {'姓名': 'new_姓名3', '年龄': 'new_年龄3', '性别': 'new_性别3'}
  7. ]
  8. # 打开CSV文件追加内容
  9. with open(r'E:\test.csv', 'a', newline='') as csvfile:
  10. # 创建csv写入器对象
  11. writer = csv.writer(csvfile)
  12. # 写入空行
  13. writer.writerow([])
  14. # 写入键值对数据
  15. fieldnames = data[0].keys() # 确定列标题(即键)
  16. writer.writerow(fieldnames) # 写入列标题
  17. for row in data:
  18. writer.writerow(row.values()) # 写入数据行

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/212595
推荐阅读
相关标签
  

闽ICP备14008679号