Python 官方文档:入门教程 => 点击学习
目录 专栏导读 1. CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3.1 读取CSV文件示例 3.2 写入CSV文件示例 4 CSV文件的常用数据处理 4.1 读取CSV文件的特定列 4.2 读取CSV文件
目录
专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html
CSV(逗号分隔值)是一种常见的文本文件格式,用于存储表格数据。每行代表一条记录,每个字段之间使用逗号或其他特定分隔符进行分隔。CSV文件可以使用纯文本编辑器打开,也可以用电子表格软件(如Microsoft excel、Google Sheets)进行编辑。
python中的csv
模块提供了处理CSV文件的功能。它包含用于读取和写入CSV文件的各种方法和对象,如csv.reader
、csv.writer
、csv.DictReader
和csv.DictWriter
等。
假设我们有一个名为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']
现在,假设我们有一组字典数据,我们想将其写入到一个新的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
通过csv.reader
或csv.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.reader
和csv.DictReader
分别读取CSV文件,并根据特定的列索引或列名提取所需的列数据。然后,我们将特定列的数据存储在一个列表中,供后续处理使用。注意:使用
csv.DictReader
时,每行数据将被解析为一个字典,其中键是CSV文件的第一行(表头)的列名。这样我们可以通过列名来访问特定列的值。而使用csv.reader
时,每行数据将被解析为一个列表,我们可以通过列索引来访问特定列的值。
要读取CSV文件的特定行,我们可以使用csv.reader
或csv.DictReader
来逐行读取CSV文件,并在读取过程中判断行号是否满足特定条件。以下是使用csv.reader
和csv.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.reader
和csv.DictReader
来读取CSV文件,并通过特定的行号(索引)获取了相应的行数据。注意,行号是从0开始的,因为在Python中索引是从0开始计数。根据需要,可以调整row_number
参数来读取不同的行。
在处理CSV文件时,有一些常见的特殊情况需要特别处理。以下是一些常见的特殊处理情况
处理包含逗号、引号和换行符的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文件。
- 在读取和写入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)
- 如果CSV文件中存在空字段,可以使用空字符串或特定的值(如"NA"或"None")表示空字段
- 在读取CSV文件时,可以使用
csv.reader
的skipinitialspace
参数来处理前导空格
假设我们有一个名为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.reader
和csv.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.']
解释:
第一行是CSV文件的标题行,直接输出。
第二行中的
Age
字段为空,我们处理为空值(None)。第三行中的
City
字段为空,我们处理为空值(None)。第四行中的
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"的值包含前导空格,但在输出中已经去除了这些前导空格。
处理空字段在CSV文件中通常需要根据具体情况来决定。CSV文件中的空字段可以使用空字符串('')来表示,也可以使用特定的值(如"NA"或"None")来表示。在处理空字段时,需要根据数据的组织和要求来决定最合适的方式。
在Python的csv
模块中,可以使用csv.writer
和csv.DictWriter
的quoting
参数来指定如何处理空字段。
处理空字段的选项:
csv.QUOTE_MINIMAL
(默认): 如果字段为空,字段将被写入为一个空字符串('')。在读取CSV文件时,空字符串会被解析为空值。
csv.QUOTE_ALL
: 如果字段为空,字段将被写入为双引号包裹的空字符串("")。在读取CSV文件时,空字符串会被解析为空值。
csv.QUOTE_NONNUMERIC
: 如果字段为空,字段将被写入为一个空字符串('')。在读取CSV文件时,空字符串会被解析为None或空值。
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.writer
和csv.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
。你可以查看各个输出文件,观察不同选项对于空字段的处理效果。
结果如下
来源地址: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
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0