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

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

专栏导读

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

1. CSV文件格式简介

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

2 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.reader和csv.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.readerskipinitialspace参数来处理前导空格
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.writer和csv.DictWriter的quoting参数来指定如何处理空字段。

处理空字段的选项:

  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_MINIMAL、csv.QUOTE_ALL、csv.QUOTE_NONNUMERIC和csv.QUOTE_NONE。你可以查看各个输出文件,观察不同选项对于空字段的处理效果。

结果如下




相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
目录
打赏
0
0
0
0
20
分享
相关文章
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
121 4
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
[oeasy]python094_使用python控制音符列表_midi_文件制作
本文介绍了如何使用Python控制音符列表制作MIDI文件。首先回顾了列表下标索引(正数和负数)的用法,接着通过`mido`库实现MIDI文件生成。以《两只老虎》为例,详细解析了代码逻辑:定义音高映射、构建旋律列表、创建MIDI文件框架,并将音符插入音轨。还探讨了音符时值与八度扩展的实现方法。最终生成的MIDI文件可通过不同平台播放或编辑。总结中提到,此技术可用于随机生成符合调性的旋律,同时引发对列表其他实际应用的思考。
33 5
|
3月前
|
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
193 69
如何在Python中高效实现CSV到JSON的数据转换
在实际项目中,数据格式转换是常见问题,尤其从CSV到JSON的转换。本文深入探讨了多种转换方法,涵盖Python基础实现、数据预处理、错误处理、性能优化及调试验证技巧。通过分块处理、并行处理等手段提升大文件转换效率,并介绍如何封装为命令行工具或Web API,实现自动化批量处理。关键点包括基础实现、数据清洗、异常捕获、性能优化和单元测试,确保转换流程稳定高效。
231 83
Python文件打包:一站式指南
本文深入探讨Python文件打包的各种方法,从基础的zip和tar工具到高级的setuptools、PyInstaller、cx_Freeze等,涵盖Docker镜像、虚拟环境及自包含可执行文件的打包方式。通过示例代码与详细解析,帮助开发者根据项目需求选择合适的打包方案,提升代码分发与部署效率。内容全面,适合各水平读者学习参考。
198 7
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
200 34
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
Python 高级编程与实战:深入理解网络编程与异步IO
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧、数据科学、机器学习、Web 开发和 API 设计。本文将深入探讨 Python 在网络编程和异步IO中的应用,并通过实战项目帮助你掌握这些技术。
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
148 20

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问