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

结果如下




相关实践学习
基于Hologres轻量实时的高性能OLAP分析
本教程基于GitHub Archive公开数据集,通过DataWorks将GitHub中的项⽬、行为等20多种事件类型数据实时采集至Hologres进行分析,同时使用DataV内置模板,快速搭建实时可视化数据大屏,从开发者、项⽬、编程语⾔等多个维度了解GitHub实时数据变化情况。
阿里云实时数仓实战 - 用户行为数仓搭建
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求:熟练掌握 SQL 语法熟悉 Linux 命令,对 Hadoop 大数据体系有一定的了解   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
目录
相关文章
|
6月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
145 4
|
2月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
2月前
|
编译器 Python
如何利用Python批量重命名文件
本文介绍了如何使用Python和PyCharm对文件进行批量重命名,包括文件名前后互换、按特定字符调整顺序等实用技巧,并提供了完整代码示例。同时推荐了第三方工具Bulk Rename Utility,便于无需编程实现高效重命名。适用于需要处理大量文件命名的场景,提升工作效率。
|
3月前
|
编解码 Prometheus Java
当Python同时操作1000个文件时,为什么你的CPU只用了10%?
本文介绍如何构建一个高效的文件处理系统,解决单线程效率低、多线程易崩溃的矛盾。通过异步队列与多线程池结合,实现任务调度优化,提升I/O密集型操作的性能。
63 4
|
3月前
|
人工智能 索引 Python
[oeasy]python094_使用python控制音符列表_midi_文件制作
本文介绍了如何使用Python控制音符列表制作MIDI文件。首先回顾了列表下标索引(正数和负数)的用法,接着通过`mido`库实现MIDI文件生成。以《两只老虎》为例,详细解析了代码逻辑:定义音高映射、构建旋律列表、创建MIDI文件框架,并将音符插入音轨。还探讨了音符时值与八度扩展的实现方法。最终生成的MIDI文件可通过不同平台播放或编辑。总结中提到,此技术可用于随机生成符合调性的旋律,同时引发对列表其他实际应用的思考。
76 5
|
2月前
|
数据采集 监控 算法
Python文件与目录比较全攻略:从基础操作到性能优化
文件比较的核心在于数据指纹校验,通过逐字节比对生成唯一标识,确保内容一致性。从标准库的os与filecmp到高性能第三方库如pydiffx,再到分布式与量子加密技术的未来趋势,文件比较广泛应用于数据备份、代码审查与系统监控等领域,是保障数据完整性的关键技术手段。
67 0
|
5月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
240 69
|
3月前
|
数据采集 存储 API
Python爬虫结合API接口批量获取PDF文件
Python爬虫结合API接口批量获取PDF文件
|
3月前
|
数据采集 运维 BI
Python 文件操作进阶|使用 shutil 实现高效文件复制
在开发和运维中,处理大量文件是常见需求,如备份配置、归档日志或构建部署包。手动复制粘贴已无法满足高效需求!Python 的 `shutil` 模块提供了强大的文件操作功能,支持单文件复制、目录树迁移及自动化任务构建。本文详解 `shutil.copy()` 基础用法与进阶技巧,如批量复制、自动路径检测、时间戳命名备份等,助你实现高效自动化。结合实战案例(如自动备份系统),让你的代码更专业!学习后,欢迎交流心得,一起精进 Python 技能。关注我,获取更多编程技巧与源码分享!
|
5月前
|
Shell 开发者 Docker
Python文件打包:一站式指南
本文深入探讨Python文件打包的各种方法,从基础的zip和tar工具到高级的setuptools、PyInstaller、cx_Freeze等,涵盖Docker镜像、虚拟环境及自包含可执行文件的打包方式。通过示例代码与详细解析,帮助开发者根据项目需求选择合适的打包方案,提升代码分发与部署效率。内容全面,适合各水平读者学习参考。
354 7

热门文章

最新文章

推荐镜像

更多