【100天精通python】Day27:文件与IO操作_CSV文件处理

目录

 专栏导读 

 1. CSV文件格式简介

2 csv模块的使用方法

3 读写CSV文件的示例

3.1 读取CSV文件示例

3.2 写入CSV文件示例

4 CSV文件的常用数据处理

4.1 读取CSV文件的特定列

4.2 读取CSV文件的特定行

5 csv 文件的特殊处理

5.1 处理包含逗号、换行符、引号的字段

5.2 处理非ASCII字符 

5.3 处理空字段 

5.3.1 读取空字段

5.3.2  指定参数处理空字段


 专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html


 1. CSV文件格式简介

        CSV(逗号分隔值)是一种常见的文本文件格式,用于存储表格数据。每行代表一条记录,每个字段之间使用逗号或其他特定分隔符进行分隔。CSV文件可以使用纯文本编辑器打开,也可以用电子表格软件(如Microsoft Excel、Google Sheets)进行编辑。

csv模块的使用方法

Python中的csv模块提供了处理CSV文件的功能。它包含用于读取和写入CSV文件的各种方法和对象,如csv.readercsv.writercsv.DictReadercsv.DictWriter等。

3 读写CSV文件的示例

3.1 读取CSV文件示例

假设我们有一个名为data.csv的CSV文件,内容如下:

Name,Age,City
John,30,New York
Jane,25,San Francisco
Mike,35,Chicago

我们可以使用csv.reader来读取并处理这个CSV文件

import csv# 读取CSV文件并处理数据
with open('data.csv', 'r', newline='') as file:csv_reader = csv.reader(file)# 遍历每一行数据for row in csv_reader:print(row)

输出:

['Name', 'Age', 'City']
['John', '30', 'New York']
['Jane', '25', 'San Francisco']
['Mike', '35', 'Chicago']

3.2 写入CSV文件示例

现在,假设我们有一组字典数据,我们想将其写入到一个新的CSV文件output.csv中:

import csv# 要写入的数据
data = [{"Name": "Alice", "Age": 28, "City": "London"},{"Name": "Bob", "Age": 32, "City": "Paris"},{"Name": "Eve", "Age": 24, "City": "Berlin"}
]# 写入CSV文件
with open('output.csv', 'w', newline='') as file:fieldnames = ['Name', 'Age', 'City']csv_writer = csv.DictWriter(file, fieldnames=fieldnames)# 写入表头csv_writer.writeheader()# 写入数据csv_writer.writerows(data)print("Data has been written to output.csv.")

输出: 

Name,Age,City
Alice,28,London
Bob,32,Paris
Eve,24,Berlin

4 CSV文件的常用数据处理

4.1 读取CSV文件的特定列

        通过csv.readercsv.DictReader读取CSV文件后,仅保留所需的列数据进行处理。我们可以通过列索引或列名来指定特定的列。

示例: 假设我们有一个名为data.csv的CSV文件,内容如下:

Name,Age,City
John,30,New York
Jane,25,San Francisco
Mike,35,Chicago

我们将展示两种方法来读取CSV文件的特定列:

方法一:使用列索引

import csv# 读取CSV文件并获取特定列数据
with open('data.csv', 'r', newline='') as file:csv_reader = csv.reader(file)# 将列索引设为1(第二列Age)column_index = 1# 初始化存储特定列数据的列表specific_column_data = []# 遍历每一行数据for row in csv_reader:# 获取特定列的值,并添加到列表中specific_column_data.append(row[column_index])print("Specific column data:", specific_column_data)

输出:

Specific column data: ['Age', '30', '25', '35']

方法二:使用列名

import csv# 读取CSV文件并获取特定列数据
with open('data.csv', 'r', newline='') as file:csv_reader = csv.DictReader(file)# 将列名设为'Age'column_name = 'Age'# 初始化存储特定列数据的列表specific_column_data = []# 遍历每一行数据for row in csv_reader:# 获取特定列的值,并添加到列表中specific_column_data.append(row[column_name])print("Specific column data:", specific_column_data)

输出

Specific column data: ['30', '25', '35']

以上示例中,我们通过csv.readercsv.DictReader分别读取CSV文件,并根据特定的列索引或列名提取所需的列数据。然后,我们将特定列的数据存储在一个列表中,供后续处理使用。

注意:使用csv.DictReader时,每行数据将被解析为一个字典,其中键是CSV文件的第一行(表头)的列名。这样我们可以通过列名来访问特定列的值。而使用csv.reader时,每行数据将被解析为一个列表,我们可以通过列索引来访问特定列的值。

4.2 读取CSV文件的特定行

        要读取CSV文件的特定行,我们可以使用csv.readercsv.DictReader来逐行读取CSV文件,并在读取过程中判断行号是否满足特定条件。以下是使用csv.readercsv.DictReader读取CSV文件特定行的示例:

示例1:使用csv.reader读取特定行

假设我们有一个名为data.csv的CSV文件,内容如下:

Name,Age,City
John,30,New York
Jane,25,San Francisco
Mike,35,Chicago

我们可以使用csv.reader来读取CSV文件,并根据特定的行号来获取对应的行数据:

import csv# 读取CSV文件的特定行
def read_specific_row(csv_file, row_number):with open(csv_file, 'r', newline='') as file:csv_reader = csv.reader(file)for i, row in enumerate(csv_reader):if i == row_number:return row# 读取第二行(索引为1)的数据
specific_row = read_specific_row('data.csv', 1)
print("Specific row data:", specific_row)

输出

Specific row data: ['Jane', '25', 'San Francisco']

示例2:使用csv.DictReader读取特定行

        如果CSV文件的第一行是列名,我们可以使用csv.DictReader来读取CSV文件,并根据特定条件来获取特定行的数据:

import csv# 读取CSV文件的特定行
def read_specific_row(csv_file, row_number):with open(csv_file, 'r', newline='') as file:csv_reader = csv.DictReader(file)for i, row in enumerate(csv_reader):if i == row_number:return row# 读取第二行(索引为1)的数据
specific_row = read_specific_row('data.csv', 1)
print("Specific row data:", specific_row)

输出

Specific row data: {'Name': 'Jane', 'Age': '25', 'City': 'San Francisco'}

在以上示例中,我们分别使用了csv.readercsv.DictReader来读取CSV文件,并通过特定的行号(索引)获取了相应的行数据。注意,行号是从0开始的,因为在Python中索引是从0开始计数。根据需要,可以调整row_number参数来读取不同的行。

5 csv 文件的特殊处理

在处理CSV文件时,有一些常见的特殊情况需要特别处理。以下是一些常见的特殊处理情况

5.1 处理包含逗号、换行符、引号的字段

        处理包含逗号、引号和换行符的CSV文件,可以使用Python的csv模块来读取和写入数据。csv模块提供了对于特殊字符的自动处理,包括将包含逗号、引号和换行符的字段用引号包裹起来,并在引号内的引号进行转义。

示例:

假设我们要处理以下包含特殊字符的CSV文件,名为data.csv

Name,Age,Description
John,30,"A software, ""guru"" with 5 years of experience. Fluent in English and Español."
Jane,25,"A data analyst with ""extensive"" skills. 
Passionate about data visualization."
Mike,35,"Project manager with experience leading international teams.
Deutsch sprechen."

我们可以使用下面的代码来读取和处理这个包含特殊字符的CSV文件:

import csv# 读取包含特殊字符的CSV文件并输出内容
with open('data.csv', 'r', newline='') as file:csv_reader = csv.reader(file)for row in csv_reader:print(row)

输出结果

['Name', 'Age', 'Description']
['John', '30', 'A software, "guru" with 5 years of experience. Fluent in English and Español.']
['Jane', '25', 'A data analyst with "extensive" skills.\nPassionate about data visualization.']
['Mike', '35', 'Project manager with experience leading international teams.\nDeutsch sprechen.']

        在输出结果中,我们可以看到csv.reader模块正确处理了包含逗号、引号和换行符的字段,并将其解析为正确的数据。

如果要将数据写入到包含特殊字符的CSV文件中,可以使用以下示例代码:

import csv# 要写入的数据,包含特殊字符的字段
data = [["Name", "Age", "Description"],["John", 30, 'A software, "guru" with 5 years of experience. Fluent in English and Español.'],["Jane", 25, 'A data analyst with "extensive" skills.\nPassionate about data visualization.'],["Mike", 35, 'Project manager with experience leading international teams.\nDeutsch sprechen.']
]# 写入CSV文件,并设置引号限定符为双引号
with open('output.csv', 'w', newline='') as file:csv_writer = csv.writer(file, quoting=csv.QUOTE_MINIMAL)# 写入数据csv_writer.writerows(data)print("CSV file with fields containing special characters has been created.")

        在写入数据时,我们使用csv.writer并设置引号限定符为csv.QUOTE_MINIMAL,表示只在必要时才使用引号包裹字段,确保数据的正确性。

输出文件内容:

Name,Age,Description
John,30,A software, "guru" with 5 years of experience. Fluent in English and Español.
Jane,25,A data analyst with "extensive" skills.\nPassionate about data visualization.
Mike,35,Project manager with experience leading international teams.\nDeutsch sprechen.

        在输出文件中,csv模块自动处理了包含特殊字符的字段,并将其写入到CSV文件中。

        在读取CSV文件时,使用csv.reader并指定适当的参数,可以正确地解析包含特殊字符的数据。在写入CSV文件时,使用csv.writer并设置合适的引号限定符,可以确保数据正确写入CSV文件。

5.2 处理非ASCII字符 

  • 在读取和写入CSV文件时,可以使用 ​encoding​参数来指定文件的编码格式。
  • CSV文件通常使用UTF-8编码来支持包含非ASCII字符的文本数据。
  • import csv# 读取包含非ASCII字符的CSV文件
    with open("data.csv", "r", encoding="utf-8") as file:csv_reader = csv.reader(file)for row in csv_reader:print(row)# 写入包含非ASCII字符的CSV文件
    data = [["中文", "English"], ["数据", "Data"]]
    with open("data.csv", "w", newline="", encoding="utf-8") as file:csv_writer = csv.writer(file)csv_writer.writerows(data)

5.3 处理空字段 

  • 如果CSV文件中存在空字段,可以使用空字符串或特定的值(如"NA"或"None")表示空字段
  • 在读取CSV文件时,可以使用 ​csv.reader​的 ​skipinitialspace​参数来处理前导空格
5.3.1 读取空字段

假设我们有一个名为data.csv的CSV文件,内容如下:

Name,Age,City,Description
John,30,New York,"Software engineer with 5 years of experience. Fluent in English and Español."
Jane,,San Francisco,"Data analyst with a passion for data visualization. Speaks français."
Mike,35,, "Project manager with experience leading international teams. Deutsch sprechen."

注意上面的CSV文件中存在空字段。

        我们依然可以使用csv.readercsv.DictReader来读取这个包含空字段的CSV文件,并对空字段进行处理:

示例1:

import csv# 读取CSV文件并输出内容
with open('data.csv', 'r', newline='') as file:csv_reader = csv.reader(file)for row in csv_reader:# 处理空字段processed_row = [field.strip() if field.strip() else None for field in row]print(processed_row)

输出:

['Name', 'Age', 'City', 'Description']
['John', '30', 'New York', 'Software engineer with 5 years of experience. Fluent in English and Español.']
['Jane', None, 'San Francisco', 'Data analyst with a passion for data visualization. Speaks français.']
['Mike', '35', None, 'Project manager with experience leading international teams. Deutsch sprechen.']

解释:

  1. 第一行是CSV文件的标题行,直接输出。

  2. 第二行中的Age字段为空,我们处理为空值(None)。

  3. 第三行中的City字段为空,我们处理为空值(None)。

  4. 第四行中的Description字段不为空,输出不变。

        在处理空字段时,我们使用列表推导式来遍历每一行中的字段。field.strip()用于去除字段两侧的空白字符(包括换行符、空格等),然后我们使用条件表达式来判断是否为空字段。如果字段不为空,则保持原值;如果字段为空,则将其处理为None表示空值。最终,我们得到了处理后的每一行数据。

   示例2 :  

        可以使用csv.reader来读取这个包含空字段和前导空格的CSV文件,并使用skipinitialspace=True来处理前导空格

import csv# 读取CSV文件并输出内容
with open('data.csv', 'r', newline='') as file:csv_reader = csv.reader(file, skipinitialspace=True)for row in csv_reader:print(row)

输出

['Name', 'Age', 'City', 'Description']
['John', '30', 'New York', 'Software engineer with 5 years of experience.']
['Jane', '', 'San Francisco', 'Data analyst with a passion for data visualization.']
['Mike', '35', '', 'Project manager with experience leading international teams.']

        在示例中,我们使用csv.reader来读取CSV文件,并使用skipinitialspace=True来处理前导空格。结果显示,字段值前的空格已被自动去除,这样可以更好地处理包含前导空格的数据。在第二行和第三行中,字段"Age"和"City"的值包含前导空格,但在输出中已经去除了这些前导空格。

 5.3.2  指定参数处理空字段

        处理空字段在CSV文件中通常需要根据具体情况来决定。CSV文件中的空字段可以使用空字符串('')来表示,也可以使用特定的值(如"NA"或"None")来表示。在处理空字段时,需要根据数据的组织和要求来决定最合适的方式。

        在Python的csv模块中,可以使用csv.writercsv.DictWriterquoting参数来指定如何处理空字段。

处理空字段的选项:

  1. csv.QUOTE_MINIMAL(默认): 如果字段为空,字段将被写入为一个空字符串('')。在读取CSV文件时,空字符串会被解析为空值。

  2. csv.QUOTE_ALL 如果字段为空,字段将被写入为双引号包裹的空字符串("")。在读取CSV文件时,空字符串会被解析为空值。

  3. csv.QUOTE_NONNUMERIC 如果字段为空,字段将被写入为一个空字符串('')。在读取CSV文件时,空字符串会被解析为None或空值。

  4. csv.QUOTE_NONE 如果字段为空,字段将被写入为一个空字符串('')。在读取CSV文件时,空字符串会被解析为空字符串本身,而不是空值。

示例:

假设我们有一个包含空字段的CSV文件,名为data.csv,内容如下:

Name,Age,City,Description
John,30,New York,
Jane,,San Francisco,"Data analyst with a passion for data visualization."
Mike,35,,Project manager

我们将使用csv.writercsv.DictWriter来处理这个包含空字段的CSV文件,并演示不同选项的效果。

import csv# CSV文件处理选项
quoting_options = [csv.QUOTE_MINIMAL, csv.QUOTE_ALL, csv.QUOTE_NONNUMERIC, csv.QUOTE_NONE]
output_files = ['output_minimal.csv', 'output_all.csv', 'output_nonnumeric.csv', 'output_none.csv']# 处理CSV文件
for quoting, output_file in zip(quoting_options, output_files):# 要写入的数据,包含空字段data = [["John", 30, "New York", ""],["Jane", "", "San Francisco", "Data analyst with a passion for data visualization."],["Mike", 35, "", "Project manager"]]# 写入CSV文件with open(output_file, 'w', newline='') as file:csv_writer = csv.writer(file, quoting=quoting)# 写入数据csv_writer.writerows(data)print("CSV files with different quoting options have been created.")

        在以上示例中,我们分别使用不同的quoting选项来处理包含空字段的CSV文件,并将处理后的数据写入不同的输出文件。

      我们创建了四个输出文件,分别使用不同的quoting选项,即csv.QUOTE_MINIMALcsv.QUOTE_ALLcsv.QUOTE_NONNUMERICcsv.QUOTE_NONE。你可以查看各个输出文件,观察不同选项对于空字段的处理效果。

 结果如下

 

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

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

相关文章

Verilog学习记录-自用

always语句块一定条件写完整,否则电平触发,综合生成锁存器 task不可综合,主要用于仿真/验证 大部分都是并行执行的,只有begin end块中阻塞语句是串行 if-else和case的区别 if-else面积小,但时延(执…

软件为什么要进行性能压力测试?

软件为什么要进行性能压力测试?随着软件应用的不断增多和复杂度的提高,软件的性能对用户体验和业务成功至关重要。性能问题可能导致软件运行缓慢、崩溃或无响应,给用户带来不便甚至损失。为了确保软件能够在高负载和压力下正常运行&#xff0…

【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

📢前言:本篇是关于如何使用YoloV5Deepsort训练自己的数据集,从而实现目标检测与目标追踪,并绘制出物体的运动轨迹。本章讲解的为第一个内容:简单介绍YoloV5Deepsort中所用到的目标检测,追踪及sort&Depp…

el-table 去掉边框(修改颜色)

原始&#xff1a; 去掉表格的border属性&#xff0c;每一行下面还会有一条线&#xff0c;并且不能再拖拽表头 为了满足在隐藏表格边框的情况下还能拖动表头&#xff0c;修改相关css即可&#xff0c;如下代码 <style lang"less"> .table {//避免单元格之间出现白…

UI自动化测试之Jenkins配置

背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&#xff0c;但由于各种原因&#xff0c;接口自动化测试那部分功能整个废弃掉了&#xff0c;其中…

Spring5.2.x 源码使用Gradle成功构建

一 前置准备 1 Spring5.2.x下载 1.1 Spring5.2.x Git下载地址 https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2 Spring5.2.x zip源码包下载&#xff0c;解压后倒入idea https://gitcode.net/mirrors/spring-projects/spring-framework/-/…

【NLP概念源和流】 05-引进LSTM网络(第 5/20 部分)

一、说明 在上一篇博客中,我们讨论了原版RNN架构,也讨论了它的局限性。梯度消失是一个非常重要的缺点,它限制了RNN对较短序列的建模。香草 RNN 在相关输入事件和目标信号之间存在超过 5-10 个离散时间步长的时间滞时无法学习。这基本上限制了香草RNN在许多实际问题上的应用,…

数学知识(三)

一、容斥原理 #include<iostream> #include<algorithm>using namespace std;const int N 20;typedef long long LL; int n,m; int p[N];int main() {cin>>n>>m;for(int i 0;i < m;i ) cin>>p[i];int res 0;//从1枚举到2^m(位运算)for(int …

【C++】开源:事件驱动网络库libevent配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…

Dockerfile构建Tomcat镜像(源码)

Dockerfile构建Tomcat镜像 目录 Dockerfile构建Tomcat镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 5、浏览器访问测试&#xff1a; 1、建立工作目录 [roothuyang1 ~]# mkdir tomcat[roothuyang1 ~]# cd tomcat/[roothuyang1 tomcat]# lsapach…

【Python】基础数据结构:列表——元组——字典——集合

文章目录 一、简述二、Python中的列表详解2.1 创建列表2.2 访问列表元素2.3 修改列表元素2.4 列表切片2.5 列表方法2.6 列表推导式 三、Python中的元组详解3.1 创建元组3.2 访问元组元素3.3 元组是不可变的3.4 元组切片3.5 元组方法 四、Python中的字典详解4.1 创建字典4.2 访问…

华为HarmonyOS NEXT初体验,打造纯血鸿蒙指日可待,适配百款应用

在2023年的华为开发者大会&#xff08;HDC.Together&#xff09;&#xff0c;华为推出了面向开发者的HarmonyOS NEXT开发者预览版&#xff0c;此外还有面向消费者的HarmonyOS 4。华为宣布&#xff0c;HarmonyOS NEXT已开放给合作企业开发者&#xff0c;计划在2024年第一季度对所…

多线程篇-线程安全-原子性、可见性、有序性解析

多线程篇-线程安全-原子性、可见性、有序性解析 在程序中使用多线程的目的是什么&#xff1f; 1、提高效率&#xff0c;增加任务的吞吐量 2、提升CPU等资源的利用率&#xff0c;减少CPU的空转 多线程的应用在日常开发中很多&#xff0c;带来了很多的便利&#xff0c;让我们以前…

图像快速傅里叶变换的工业应用案例简介:图像自相关,背景纹理去除,旋转矫正,划痕检测

快速傅里叶变换是非常重要的数学分析工具&#xff0c;同时也是一种非常重要的信号处理方法。 下面借助Halcon商业图像处理库&#xff0c;介绍些工业应用案例&#xff0c;我们可以通过案例理解图像快速傅里叶变换的一些应用场景。 案例1&#xff1a;图像自相关性确定芯片间距 …

体育赛事管理系统的设计与实现(源码+论文)_kaic

摘要 许多年以前&#xff0c;人们在对数据进行统计和记录时候&#xff0c;使用的是纸和笔&#xff0c;对于大量数据的记录很不方便&#xff0c;使用的人力物力也很庞大&#xff0c;到了现在&#xff0c;人们对纸和笔的依赖慢慢降低&#xff0c;在如今的互联网时代&#xff0c;…

python爬虫1:基础知识

python爬虫1&#xff1a;基础知识 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 目录结构 文章目录 python爬虫1&#xff1a;基础知识1. 基础认知1.1 什么是爬虫&…

3.CNI网络

文章目录 CNI网络FlannelUDP模式VXLAN模式部署flannel CalicoCalico模式Calico部署 flannel 和 calico 区别 CNI网络 K8S 中 Pod 网络通信&#xff1a; Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命…

Redis内网主从节点搭建

Redis内网主从节点搭建 1、文件上传2、服务安装3、服务启动4、配置主从复制 1、文件上传 内网环境手动上传gcc-c、redis.tar文件 2、服务安装 # 解压 unzip gcc-c.zip unzip gcc_rpm.zip tar -zxvf redis-6.2.13.tar.gz# 安装 cd gcc_rpm/ rpm -ivh *.rpm --nodeps --force…

【HDFS】每天一个RPC系列----complete(二):客户端侧

上图给出了最终会调用到complete RPC的客户端侧方法链路(除去Router那条线了)。 org.apache.hadoop.hdfs.DFSOutputStream#completeFile(org.apache.hadoop.hdfs.protocol.ExtendedBlock): 下面这个方法在complete rpc返回true之前,会进行重试,直到超过最大重试次数抛异…

ChatGPT下架官方检测工具,承认无法鉴别AI内容

去年底&#xff0c;OpenAI 推出的 ChatGPT &#xff0c;带来了生成式人工智能涌现的热潮。它不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务&#xff0c;还能通过学习和理解人类的语言来进行对话&#xff0c;并根据聊天的上下文进行互动。 但随之而来的争议也让人…