专栏导读
专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html
1. CSV文件格式简介
CSV(逗号分隔值)是一种常见的文本文件格式,用于存储表格数据。每行代表一条记录,每个字段之间使用逗号或其他特定分隔符进行分隔。CSV文件可以使用纯文本编辑器打开,也可以用电子表格软件(如Microsoft Excel、Google Sheets)进行编辑。
2 csv模块的使用方法
Python中的csv
模块提供了处理CSV文件的功能。它包含用于读取和写入CSV文件的各种方法和对象,如csv.reader
、csv.writer
、csv.DictReader
和csv.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.reader
或csv.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.reader
或csv.DictReader
来逐行读取CSV文件,并在读取过程中判断行号是否满足特定条件。以下是使用csv.reader
和csv.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.reader
和csv.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.reader
的skipinitialspace
参数来处理前导空格
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.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"的值包含前导空格,但在输出中已经去除了这些前导空格。
5.3.2 指定参数处理空字段
处理空字段在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,Description John,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。你可以查看各个输出文件,观察不同选项对于空字段的处理效果。
结果如下