Python读写csv文件

news2024/11/24 16:13:27

简介

通过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. 读取全部内容

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

import csv

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

                            

1.2. 固定读取第n行

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

import csv

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

                            

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

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

                            

1.3. 范围读取第n-m行

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

读取第 3 - 5 行

import csv

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

                            

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

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

                            

1.4. 读取最后一行

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

import csv

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

                            

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

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

                            

1.5. 跳过第n-m行

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

import csv

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

                            

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

  • 如果CSV文件非常大,将其读取到内存中作为列表可能会导致内存占用过高,尤其是在处理大型CSV文件时,可能会影响程序的性能并导致内存不足错误。
import csv

# 指定字符集为 utf-8-sig 是为了自动处理BOM字符,并消除\ufeff的出现
with open(r'E:\test.csv', 'r', encoding='utf-8-sig') as f:
    # 创建csv阅读器对象
    reader = csv.reader(f)
    # 将csv对象转换为列表
    row_list = list(reader)

    # 遍历这个列表和行号
    for num,row in enumerate(row_list, 1):
        # 如果行号=总行数,跳出循环
        if num == len(row_list):
            break
        # 输出每行内容
        print(row)

                            

1.6. 固定读取第n列

通过索引读取第 3 列

import csv

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

                            

读取第1、2、4列

import csv

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

                            

读取最后 1 列 

import csv

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

                            

1.7. 范围读取第n-m列

通过索引读取第 2-4 列

import csv

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

                             

1.8. 跳过第n-m列

跳过第 2-3 列

import csv

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

                            

跳过最后一列

import csv

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

                            

                            

2. 写入 csv 文件

2.1. 追加内容但最后

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

import csv

# w表示覆盖,a表示追加
with open(r'E:\test.csv', 'a', newline='', encoding='utf-8-sig') as f:
    # 创建csv写入器对象
    writer = csv.writer(f)

    '''写入单行'''
    writer.writerow([])     # 如果前面有内容,先写入 一个空行
    writer.writerow([6, 13, '妲己', '女', '约会'])

    '''写入多行,关键字后面加s'''
    data = [
        [7, 49, '孙悟空', '男', '打架'],
        [8, 14, '猪八戒', '男', '吃饭'],
        [9, 20, '沙悟净', '男', '干活']
    ]
    writer.writerows(data)

                            

2.2. 指定第n行写入内容

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

import csv

# 读取文件内容,转换为列表
with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
    original_data = list(csv.reader(f))

# 指定在第2行插入内容
original_data.insert(1, [6, 13, '妲己', '女', '约会'])

# 将新内容直接覆盖到原文件
with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerows(original_data)

                            

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

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

import csv

# 读取文件内容,转换为列表
with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
    original_data = list(csv.reader(f))

# 指定在第2行、第3列后面追加内容
original_data[1].insert(3, '临时1,临时2')

# 将新内容直接覆盖到原文件
with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerows(original_data)

                            

2.4. 修改第n行m列内容

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

import csv

# 读取文件内容,转换为列表
with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
    original_data = list(csv.reader(f))

# 指定更新第2行3列的内容
original_data[1][2] = '临时1'

# 将新内容直接覆盖到原文件
with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f, quoting=csv.QUOTE_NONE, quotechar='', escapechar='\\')
    writer.writerows(original_data)

                            

2.5. 修改符合要求的值

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

import csv

# 读取文件内容,转换为列表
with open(r'E:\test.csv', 'r', newline='', encoding='utf-8-sig') as f:
    rows = list(csv.reader(f))

# 遍历所有行
for row in rows:
    # 遍历所有列索引和列的值
    for idx, col in enumerate(row):
        # 判断以 '李' 开头的字符
        if col.startswith("李"):
            row[idx] = "李**"    # 修改内容

# 将新内容直接覆盖到原文件
with open(r'E:\test.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f, quoting=csv.QUOTE_NONE, quotechar='', escapechar='\\')
    writer.writerows(rows)

                            

                            

3. 字典式读取和写入

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

通过键访问值

import csv

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

                             

写入数据

import csv

# 要写入CSV文件的键值对数据
data = [
    {'姓名': 'new_姓名1', '年龄': 'new_年龄1', '性别': 'new_性别1'},
    {'姓名': 'new_姓名2', '年龄': 'new_年龄2', '性别': 'new_性别2'},
    {'姓名': 'new_姓名3', '年龄': 'new_年龄3', '性别': 'new_性别3'}
]

# 打开CSV文件追加内容
with open(r'E:\test.csv', 'a', newline='') as csvfile:
    # 创建csv写入器对象
    writer = csv.writer(csvfile)

    # 写入空行
    writer.writerow([])

    # 写入键值对数据
    fieldnames = data[0].keys()  # 确定列标题(即键)
    writer.writerow(fieldnames)  # 写入列标题
    for row in data:
        writer.writerow(row.values())  # 写入数据行

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

香橙派Zero2安装wiringPi外设库

安装wiringOP库 直接在香橙派上下载 wiringOP 的代码 sudo apt update sudo apt install -y git git clone https://github.com/orangepi-xunlong/wiringOP 如果在香橙派上下载不下来&#xff0c;也可以在通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP …

【【高级程序设计语言C++】C++多态的概念及原理

1. 多态的概念2. 多态的定义及实现2.1. 多态的条件2.2. 虚函数2.3. 虚函数的重写2.4. 虚函数重写的两个例外2.5. C11的override和final2.6. 重载、重写、重定义的对比 3. 抽象类3.1. 概念3.2. 实现继承和接口继承的对比 4. 多态的原理4.1. 虚函数表4.2. 多态原理4.3. 动态绑定和…

(34)继电器开关

文章目录 前言 34.1 装有IOMCU的自动驾驶仪上的继电器引脚 34.2 通过任务规划器定义继电器引脚 34.3 飞行员控制继电器 34.4 任务控制继电器 34.5 任务规划器控制继电器 前言 "继电器"是自动驾驶仪上的一个数字输出引脚&#xff0c;可在 0V 和 3.3V 或 5V 之间…

商城-学习整理-基础-分布式组件(三)

目录 一、前言二、Spring Cloud&Spring Cloud Alibaba1、Spring Cloud 与Spring Cloud Alibaba简介2、为什么使用Spring Cloud Alibaba3、版本选择4、项目中的依赖 三、Spring Cloud Alibaba-Nacos作为注册中心1、Nacos1&#xff09;、下载 nacos-server2&#xff09;、启动…

【C++ 程序设计】第 1~9 章:常见知识点汇总

目录 一、C 语言简介 二、面向对象的基本概念 三、类和对象进阶 四、运算符重载 五、类的继承与派生 六、多态与虚函数 七、输入/输出流 八、文件操作 九、函数模板与类模板 一、C 语言简介 知识点名称内容C语言的发展简史★★1. C 语言是 C 语言的前身 &…

让GPT人工智能变身常用工具-上

1.密码生成器:GPT为您创建安全密码 想象GPT作为您的个人密码生成器,负责从头到尾为您创建复杂且安全的密码。您只需要告诉他您的密码需求,比如密码的长度,是否包含大写字母、小写字母、数字或特殊字符,他会立即为您生成一个复杂但经过深度设计的密码。 例子: 我希望您…

第八届中国开源年会(COSCon'23)启动!

*海报设计师&#xff1a;朱亿钦&#xff08;居居&#xff09; 一年一度的开源盛会&#xff0c;COSCon23 第八届中国开源年会&#xff0c;将于10月28~29日&#xff0c;在四川成都市高新区菁蓉汇召开&#xff01;本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相…

(css)滚动条样式

(css)滚动条样式 效果&#xff1a; /*滚动条整体样式*/ ::-webkit-scrollbar {width: 2px;/*高宽分别对应横竖滚动条的尺寸*/height: 10px; } ::-webkit-scrollbar-thumb {/*滚动条里面小方块*/border-radius: 10px;width: 2px;height: 60px;background: linear-gradient(0deg,…

leetcode 78. 子集

2023.7.22 本题为回溯系列的一道标准模板题。 如果将回溯问题抽象为一棵树的话&#xff0c;那么之前的组合、分割问题都是为了找到这棵树的叶子节点&#xff0c;而子集是要找到这棵树的所有节点。 然后要注意&#xff0c;子集是无序的&#xff0c;即{1&#xff0c;2}和{2&#…

幂等性设计与实现

文章目录 前言1.全局唯一ID1.1 前端防止重复提交1.2 token机制1.3 数据库表加唯一约束 2.幂等下 ABA问题 与乐观锁2.1 乐观锁2.2 如何解决ABA问题&#xff1f; 3.分布式锁和事务3.1 分布式锁&#xff1a;3.2. 分布式事务 前言 幂等性&#xff08;Idempotence&#xff09;是一个…

导航、开源镜像、Prompt ( AI 提示词 )、AI工具集、chatgpt镜像

1、导航 网站 众多网址导航中&#xff0c;哪个最好&#xff1f;理由是什么&#xff1f; &#xff1a;https://www.zhihu.com/question/19899559 除了百度&#xff0c;其他搜索引擎&#xff1a; 综合类搜索导航(Anywhere Anything)&#xff1a;http://lackar.com/aa/ 渗透师 导…

开源QianWei搭建音乐网站,并实现公网连接

开源QianWei搭建音乐网站&#xff0c;并实现公网连接 1、前言2、本地网页搭建2.1环境使用2.2 支持组建选择2.3 网页安装 3、本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4、公网访问测试5、结语 1、前言 音乐是我们生活和工作中不可或缺的调剂&#xff0c;它能让我们心…

二,jmeter的简介还有一些参数的说明

文章目录 一、jmeter简介及安装1. 简介2. 安装 二、jmeter设置语言三、jmeter文件路径说明四、编写jmeter脚本五、乱码的处理&#xff1a;1. 请求内容出现乱码处理方法2. 响应内容出现乱码处理方法 一、jmeter简介及安装 1. 简介 Apache 托管的开源java工具接口测试、自动化测…

Sublime Text 设置中文

文章目录 1. Subime Text 官网2. 中文设置 1. Subime Text 官网 https://www.sublimetext.com/ 2. 中文设置 打开 sublime&#xff0c;ctrl shift p&#xff0c;在对话框搜索 Install Package Control&#xff0c;点击 会弹出一个消息框&#xff0c;表示插件列表加载完成…

【每日一题】42. 接雨水

【每日一题】42. 接雨水 42. 接雨水题目描述解题思路 42. 接雨水 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输…

【STM32CubeMX】HC_SR04模块测距

前言 本文章介绍了基于STM32F103的HAL库&#xff0c;完成对HC_SR04超声波模块测距的基本思路和工程案例。 环境 STM32F103C6T6系统板&#xff0c;72MHz主频基于STM32CubeMX生成的HAL库代码硬件连接&#xff1a; PB12 — Echo(HC_SR04)&#xff0c;PB13 — Trig(HC_SR04)PB9 —…

第二十二章:Non-local Neural Networks ——非局部神经网络

0.摘要 卷积和循环操作都是一次处理一个局部邻域的基本构建模块。在本文中&#xff0c;我们提出了非局部操作作为捕捉长程依赖关系的通用构建模块族。受计算机视觉领域经典的非局部均值方法[4]的启发&#xff0c;我们的非局部操作将一个位置的响应计算为所有位置特征的加权和。…

LiveNVR监控流媒体Onvif/RTSP功能-拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明

LiveNVR拉转Onvif/RTSP/RTMP/FLV/HLS直播流流媒体服务视频广场页面集成视频播放集成说明 1、视频页面集成1.1、关闭接口鉴权1.2、视频广场页面集成1.2.1、隐藏菜单栏1.2.2、隐藏播放页面分享连接 1.3、其它页面集成 2、播放分享页面集成2.1、获取 iframe 代码2.2、html 集成ifr…

ext4 mballoc之buddy算法

buddy bitmap 根据《Ext4文件系统介绍 - 理论篇_nginux的博客-CSDN博客》我们知道磁盘上有1block 大小(默认4K&#xff09;data block bitmap&#xff0c;每bit位代表一个block的使用情况&#xff0c;1代表占用&#xff0c;0代表空闲。data block bitmap 可以表示4 * 1024 * …

代码随想录| 图论02●695岛屿最大面积 ●1020飞地的数量 ●130被围绕的区域 ●417太平洋大西洋水流问题

#695岛屿最大面积 模板题&#xff0c;很快.以下两种dfs&#xff0c;区别是看第一个点放不放到dfs函数中处理&#xff0c;那么初始化的area一个是1一个是0 int dir[4][2]{0,1,0,-1,1,0,-1,0};void dfs(int x, int y,int n, int m, int &area,vector<vector<bool>…