【python】文件读写:csv(三)
在Python中,CSV(Comma-Separated Values,逗号分隔值)文件的读取和写入可以通过内置的csv
模块轻松实现。以下是如何使用csv
模块进行CSV文件读取和写入的示例。
目录
一、读取CSV文件
1. 导入csv模块
2. 导入csv模块
3.创建CSV读取器
4.遍历CSV文件的行
5.使用csv.DictReader
二、写入CSV文件
1.打开CSV文件
2. 创建CSV写入器
3. 写入CSV文件的行
4.写入多行数据
5.使用csv.DictWriter
三、其它:mode参数
一、读取CSV文件
1. 导入csv模块
首先,你需要导入Python的csv
模块。
import csv
2. 导入csv模块
with open('example.csv', mode='r', newline='') as file:
# ...
使用open()
函数以读取模式('r'
)打开CSV文件,并指定newline=''
参数以防止在Windows上出现额外的空行。
newline=''
参数在处理Windows上的CSV文件时很重要,因为它可以防止出现额外的空行。
3.创建CSV读取器
reader = csv.reader(file)
使用csv.reader()
函数创建CSV读取器对象。
4.遍历CSV文件的行
for row in reader:
print(row) # 输出:['字段1', '字段2', '字段3', ...]
通过迭代reader
对象,可以逐行读取CSV文件的内容。每一行都被解析为一个列表,其中包含了该行的所有字段。
5.使用csv.DictReader
with open('example.csv', mode='r', newline='') as file:
reader = csv.DictReader(file)
for row in reader:
print(row['字段名']) # 输出:字段名对应的值
如果CSV文件包含标题行(header row),可以使用csv.DictReader()
将每一行解析为字典,其中键是标题,值是对应的数据。
csv.reader和csv.DictReader的区别?
- 数据表示:
csv.reader
将每一行解析为一个列表,而csv.DictReader
将每一行解析为一个字典。- 访问方式:使用
csv.reader
时,你需要通过索引来访问列的值;而使用csv.DictReader
时,你可以通过列名来访问列的值。- 标题行:
csv.DictReader
假设CSV文件的第一行是标题行,并据此创建字典的键。如果CSV文件没有标题行,你需要提供fieldnames
参数。而csv.reader
则不关心标题行,它只是简单地将每一行解析为一个列表。- 灵活性:
csv.reader
更加灵活,因为它不依赖于标题行的存在。而csv.DictReader
则更适用于那些具有明确标题行的CSV文件。
如果没有标题行,但是使用了csv.DictReader,会怎么样?
如果没有标题行,但是使用了
csv.DictReader
,csv.DictReader
将无法自动从文件中读取列名来作为字典的键。在这种情况下,可以手动为csv.DictReader
提供fieldnames
参数。如果不提供
fieldnames
参数并且CSV文件也没有标题行,那么csv.DictReader
将默认使用从第一行数据开始的列值作为字典的键。import csv # 假设你的CSV文件没有标题行,但你希望使用'Column1', 'Column2'等作为列名 fieldnames = ['Column1', 'Column2', 'Column3'] # 根据你的CSV文件定义列名 with open('example_without_header.csv', mode='r', newline='') as file: reader = csv.DictReader(file, fieldnames=fieldnames) for row in reader: # 现在你可以通过列名来访问单元格的值了 value1 = row['Column1'] value2 = row['Column2'] value3 = row['Column3'] print(value1, value2, value3)
二、写入CSV文件
1.打开CSV文件
with open('output.csv', mode='w', newline='') as file:
# ...
使用open()
函数以写入模式('w'
或'a'
,分别代表写入和追加)打开CSV文件。
2. 创建CSV写入器
writer = csv.writer(file)
使用csv.writer()
函数创建CSV写入器对象。
3. 写入CSV文件的行
writer.writerow(['字段1', '字段2', '字段3'])
使用writerow()
方法写入一行数据。该方法接受一个列表或元组作为参数,并将其写入CSV文件。
4.写入多行数据
data = [
['数据1', '数据2', '数据3'],
['数据4', '数据5', '数据6'],
# ...
]
for row in data:
writer.writerow(row)
可以通过循环来写入多行数据。
5.使用csv.DictWriter
fieldnames = ['字段名1', '字段名2', '字段名3']
with open('output.csv', mode='w', newline='') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'字段名1': '数据1', '字段名2': '数据2', '字段名3': '数据3'})
如果想将字典写入CSV文件,可以使用csv.DictWriter()
。需要提供一个字段名的列表,并使用writeheader()
方法写入标题行。
注意事项:
'w'
模式打开文件会覆盖文件中的所有内容。如果你想在文件的末尾追加内容,应该使用'a'
模式。with
语句来确保文件在操作完成后被正确关闭。csv.DictWriter()
时,确保提供的字典包含所有字段名,或者至少包含那些你打算写入的字段名。,
)分隔,这是CSV文件的默认分隔符。如果你的字段中包含逗号、换行符或引号等特殊字符,csv
模块会自动进行转义处理。三、其它:mode
参数
在Python中,open()
函数用于打开文件,其mode
参数决定了文件的打开方式。除了上文提到的r
(读取)、a
(追加)和w
(写入)之外,还有其他一些可用的模式。以下是mode
参数的一些常用值及其说明:
-
'r'
:只读模式。文件必须存在,否则抛出FileNotFoundError
异常。文件指针会被放在文件的开头。 -
'w'
:写入模式。如果文件不存在,则会创建新文件;如果文件存在,则会覆盖原文件。文件指针会被放在文件的开头。 -
'a'
:追加模式。如果文件不存在,则会创建新文件;如果文件存在,则会在文件末尾追加内容。文件指针会被放在文件的末尾。 -
'x'
:独占创建模式。如果文件已存在,则抛出FileExistsError
异常;如果文件不存在,则会创建新文件。文件指针会被放在文件的开头。这个模式通常用于确保文件是新建的,而不是覆盖已存在的文件。 -
'b'
:二进制模式。通常与其他模式(如'r'
、'w'
、'a'
)一起使用,表示文件应该以二进制模式打开,而不是文本模式。在二进制模式下,读写操作都是以字节为单位的。 -
't'
:文本模式。这是默认的模式,通常不需要显式指定。在文本模式下,读写操作都是以字符串为单位的,并且会根据平台的换行符(如\n
、\r\n
)进行转换。 -
'+'
:更新模式。通常与其他模式(如'r'
、'w'
、'a'
)一起使用,表示文件既可以读取也可以写入。例如,'r+'
表示读写模式,'w+'
表示读写模式(但会覆盖原文件),'a+'
表示在文件末尾追加并可以读取文件。
这些模式可以组合使用,但某些组合可能没有意义或不被支持。例如,'rw'
通常被简化为'r+'
,因为两者都表示读写模式。同样,'rb'
表示以二进制模式读取文件,'wb'
表示以二进制模式写入文件,依此类推。
也可以参考之前的文章【Python】文件读写(一)-CSDN博客
作者:叶阿猪