返回顶部
首页 > 资讯 > 后端开发 > Python >【100天精通python】Day27:文件与IO操作_CSV文件处理
  • 254
分享到

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

python 2023-09-04 13:09:26 254人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录  专栏导读   1. CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3.1 读取CSV文件示例 3.2 写入CSV文件示例 4 CSV文件的常用数据处理 4.1 读取CSV文件的特定列 4.2 读取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 excelGoogle Sheets)进行编辑。

csv模块的使用方法

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

3 读写CSV文件的示例

3.1 读取CSV文件示例

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

Name,Age,CityJohn,30,New YorkJane,25,San FranciscoMike,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,CityAlice,28,LondonBob,32,ParisEve,24,Berlin

4 CSV文件的常用数据处理

4.1 读取CSV文件的特定列

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

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

Name,Age,CityJohn,30,New YorkJane,25,San FranciscoMike,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,CityJohn,30,New YorkJane,25,San FranciscoMike,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,DescriptionJohn,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,DescriptionJohn,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,DescriptionJohn,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,DescriptionJohn,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。你可以查看各个输出文件,观察不同选项对于空字段的处理效果。

 结果如下

 

来源地址:https://blog.csdn.net/qq_35831906/article/details/131983330

--结束END--

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

本文链接: https://lsjlt.com/news/393607.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作