CSV(Comma-Separated Values,逗号分隔值)是一种常见的文本文件格式,用于存储表格数据,如电子表格或数据库中的数据。每行代表一条记录,字段之间一般用逗号分隔。CSV文件可以用文本编辑器打开,也可以被各种电子表格软件(如Microsoft Excel)导入和导出。
Python的csv模块提供了读取和写入CSV文件的功能,使得开发者无需关心CSV格式的细节,可以方便地处理CSV数据。该模块支持多种CSV格式变种,并允许用户自定义格式。
csv.reader用于读取CSV文件,并将每一行数据解析为一个列表(默认)或字典(结合csv.DictReader)。
csv.reader(csvfile, dialect='excel', **fmtparams)
返回一个reader对象,该对象可以迭代每一行数据。
import csv
with open('example.csv', newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
csv.writer用于将数据写入CSV文件,将数据序列化为带有分隔符的字符串。
csv.writer(csvfile, dialect='excel', **fmtparams)
返回一个writer对象,该对象具有写入数据的方法。
import csv
data = [
['Name', 'Age', 'City'],
['Alice', 30, 'New York'],
['Bob', 25, 'Los Angeles']
]
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(data)
csv.DictReader类似于csv.reader,但将每一行数据映射到一个字典,其中键由fieldnames参数指定。
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', **kwds)
返回一个DictReader对象,可以迭代每一行数据为字典。
import csv
with open('names.csv', newline='', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['first_name'], row['last_name'])
csv.DictWriter类似于csv.writer,但将字典数据映射到CSV文件的行,按照指定的字段顺序写入。
csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', **kwds)
返回一个DictWriter对象,具有写入字典数据的方法。
import csv
data = [
{'first_name': 'Alice', 'last_name': 'Smith'},
{'first_name': 'Bob', 'last_name': 'Johnson'}
]
fieldnames = ['first_name', 'last_name']
with open('names_dict.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(data)
注册一个新的CSV变种,允许用户自定义CSV格式。
csv.register_dialect(name, dialect=None, **fmtparams)
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='', encoding='utf-8') as f:
reader = csv.reader(f, dialect='unixpwd')
for row in reader:
print(row)
csv.Sniffer类用于推断CSV文件的格式,包括分隔符和是否存在标题行。
import csv
with open('example.csv', newline='', encoding='utf-8') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
has_header = csv.Sniffer().has_header(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
if has_header:
next(reader) # 跳过标题行
for row in reader:
print(row)
csv.Dialect类是一个容器类,定义了CSV文件的格式属性,如分隔符、引号字符等。
CSV模块支持多种预定义的CSV变种,如'excel'、'excel-tab'和'unix',每种变种都有不同的默认格式参数。用户也可以通过csv.register_dialect注册自定义变种。
变种名称 | 描述 |
'excel' | Excel生成的CSV文件,默认分隔符为逗号。 |
'excel-tab' | Excel生成的制表符分隔的CSV文件。 |
'unix' | UNIX系统上生成的CSV文件,使用 作为换行符,所有字段有引号包围。 |
参数名 | 描述 |
delimiter | 字段分隔符,默认为,。 |
doublequote | 控制引号字符的转义,默认为True。 |
escapechar | 用于转义特殊字符的字符,默认为None。 |
lineterminator | 行终止符,默认为 。 |
quotechar | 用于包围包含特殊字符的字段的字符,默认为"。 |
quoting | 控制何时使用引号,默认为QUOTE_MINIMAL。 |
skipinitialspace | 是否忽略分隔符后的空格,默认为False。 |
strict | 是否在输入错误时抛出异常,默认为False。 |
对于DictWriter对象,还有以下方法:
需求:读取一个包含用户信息的CSV文件,并打印每个用户的信息。
代码示例
import csv
def read_users(filename):
with open(filename, newline='', encoding='utf-8') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(f"Name: {row['first_name']} {row['last_name']}, Age: {row['age']}, City: {row['city']}")
# 假设users.csv内容如下:
# first_name,last_name,age,city
# Alice,Smith,30,New York
# Bob,Johnson,25,Los Angeles
read_users('users.csv')
输出
Name: Alice Smith, Age: 30, City: New York
Name: Bob Johnson, Age: 25, City: Los Angeles
需求:将一组用户数据写入一个新的CSV文件。
代码示例
import csv
def write_users(filename, users):
fieldnames = ['first_name', 'last_name', 'age', 'city']
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(users)
# 示例数据
users = [
{'first_name': 'Alice', 'last_name': 'Smith', 'age': 30, 'city': 'New York'},
{'first_name': 'Bob', 'last_name': 'Johnson', 'age': 25, 'city': 'Los Angeles'}
]
write_users('new_users.csv', users)
结果:生成new_users.csv文件,内容如下:
first_name,last_name,age,city
Alice,Smith,30,New York
Bob,Johnson,25,Los Angeles
需求:读取一个使用分号;作为分隔符的CSV文件。
代码示例
import csv
def read_semicolon_csv(filename):
with open(filename, newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile, delimiter=';')
for row in reader:
print(row)
# 假设semicolon.csv内容如下:
# first_name;last_name;age;city
# Alice;Smith;30;New York
# Bob;Johnson;25;Los Angeles
read_semicolon_csv('semicolon.csv')
输出
['first_name', 'last_name', 'age', 'city']
['Alice', 'Smith', '30', 'New York']
['Bob', 'Johnson', '25', 'Los Angeles']
通过本教程的学习,我们将能够熟练使用Python的csv模块,高效地处理各种CSV文件,为数据分析和处理提供强有力的支持。
常量名 | 描述 |
QUOTE_ALL | 指示writer对象给所有字段加上引号。 |
QUOTE_MINIMAL | 指示writer对象仅对包含特殊字符的字段加引号。 |
QUOTE_NONNUMERIC | 指示writer对象为所有非数字字段加上引号,reader对象将未加引号的字段转换为float类型。 |
QUOTE_NONE | 指示writer对象不对字段加引号,需自行处理特殊字符。 |
QUOTE_NOTNULL | (Python 3.12新增)指示writer对象为所有不为None的字段加引号。 |
QUOTE_STRINGS | (Python 3.12新增)指示writer对象总是为字符串字段加引号。 |
异常名 | 描述 |
Error | 所有csv模块函数可能抛出的异常。 |
参考资料
持续更新Python编程学习日志与技巧,敬请关注!
#编程# #学习# #python# #在头条记录我的2025#