【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 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
目录
相关文章
|
1月前
|
数据可视化 Linux iOS开发
Python脚本转EXE文件实战指南:从原理到操作全解析
本教程详解如何将Python脚本打包为EXE文件,涵盖PyInstaller、auto-py-to-exe和cx_Freeze三种工具,包含实战案例与常见问题解决方案,助你轻松发布独立运行的Python程序。
664 2
|
20天前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
117 1
|
28天前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
|
2月前
|
缓存 数据可视化 Linux
Python文件/目录比较实战:排除特定类型的实用技巧
本文通过四个实战案例,详解如何使用Python比较目录差异并灵活排除特定文件,涵盖基础比较、大文件处理、跨平台适配与可视化报告生成,助力开发者高效完成目录同步与数据校验任务。
118 0
|
3月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
3月前
|
编译器 Python
如何利用Python批量重命名文件
本文介绍了如何使用Python和PyCharm对文件进行批量重命名,包括文件名前后互换、按特定字符调整顺序等实用技巧,并提供了完整代码示例。同时推荐了第三方工具Bulk Rename Utility,便于无需编程实现高效重命名。适用于需要处理大量文件命名的场景,提升工作效率。
|
3月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
749 0
|
3月前
|
数据管理 开发工具 索引
在Python中借助Everything工具实现高效文件搜索的方法
使用上述方法,你就能在Python中利用Everything的强大搜索能力实现快速的文件搜索,这对于需要在大量文件中进行快速查找的场景尤其有用。此外,利用Python脚本可以灵活地将这一功能集成到更复杂的应用程序中,增强了自动化处理和数据管理的能力。
274 0
|
4月前
|
编解码 Prometheus Java
当Python同时操作1000个文件时,为什么你的CPU只用了10%?
本文介绍如何构建一个高效的文件处理系统,解决单线程效率低、多线程易崩溃的矛盾。通过异步队列与多线程池结合,实现任务调度优化,提升I/O密集型操作的性能。
86 4
|
4月前
|
人工智能 索引 Python
[oeasy]python094_使用python控制音符列表_midi_文件制作
本文介绍了如何使用Python控制音符列表制作MIDI文件。首先回顾了列表下标索引(正数和负数)的用法,接着通过`mido`库实现MIDI文件生成。以《两只老虎》为例,详细解析了代码逻辑:定义音高映射、构建旋律列表、创建MIDI文件框架,并将音符插入音轨。还探讨了音符时值与八度扩展的实现方法。最终生成的MIDI文件可通过不同平台播放或编辑。总结中提到,此技术可用于随机生成符合调性的旋律,同时引发对列表其他实际应用的思考。
136 5

推荐镜像

更多