【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.reader
、csv.writer
、csv.DictReader
和csv.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.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
时,每行数据将被解析为一个列表,我们可以通过列索引来访问特定列的值。
4.2 读取CSV文件的特定行
要读取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
参数来读取不同的行。
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.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,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
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341