Python csv模块quoting参数可用整数:是否有隐含映射及文档说明?
问题描述
Python的csv模块定义了QUOTE_ALL、QUOTE_MINIMAL、QUOTE_NONNUMERIC、QUOTE_NONE常量,用于quoting关键字参数,示例代码如下:
with open('eggs.csv', 'w', newline='') as csvfile: spamwriter = csv.writer(csvfile, quoting=csv.QUOTE_ALL) spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
但发现该参数同样接受0-3的整数,分别对应QUOTE_MINIMAL(0)、QUOTE_ALL(1)、QUOTE_NONNUMERIC(2)、QUOTE_NONE(3),此映射在Pandas库文档中被提及,示例代码如下:
with open('eggs.csv', 'w', newline='') as csvfile: spamwriter = csv.writer(csvfile, quoting=2) spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
使用大于3的整数会触发TypeError: bad "quoting" value。然而该行为在Python官方csv文档及源码中均无相关说明,请问是否存在未知的隐含映射?该机制如何运作,是否有官方文档记录?
回答
这个整数映射并非“隐含”,而是这些常量本身就是对应数值的别名。你可以直接在Python交互环境里验证:
>>> import csv >>> csv.QUOTE_MINIMAL 0 >>> csv.QUOTE_ALL 1 >>> csv.QUOTE_NONNUMERIC 2 >>> csv.QUOTE_NONE 3
csv模块在内部实现时,quoting参数本质上就是接收整数,而这些常量只是为了提升代码可读性而定义的命名标识。当你传入整数0-3时,其实就是直接使用了常量对应的底层数值。
关于官方文档的问题:虽然Python官方csv文档没有专门强调这一点,但从常量的定义逻辑来看,这种映射是必然的——因为这些常量本身就是赋值为对应整数的。查看csv模块的源码(如csv.py文件),会看到类似这样的定义:
QUOTE_MINIMAL = 0 QUOTE_ALL = 1 QUOTE_NONNUMERIC = 2 QUOTE_NONE = 3
之所以使用大于3的整数会报错,是因为csv模块内部对quoting参数做了范围校验,只允许0-3的整数取值,超出范围就会抛出TypeError。
Pandas文档提及这个映射,只是因为Pandas在处理csv时会直接对接Python原生csv模块的参数,所以特意做了说明,方便用户理解两种传参方式的等价性。
内容的提问来源于stack exchange,提问作者Josh Friedlander

