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之间的整数,它们Map到QUOTE_MINIMAL(0)、QUOTE_ALL(1)、QUOTE_NONNUMERIC(2)或QUOTE_NONE(3)。(我在the documentation of the Pandas library中找到了这个):
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
文档只是说模块定义了这些常量),在csv
库的源代码中也找不到。
有没有一些我不知道的常量的隐式Map?这是如何工作的,是否有记录?
2条答案
按热度按时间uelo1irk1#
此行为记录在
Dialect.quoting
的描述中:它可以接受任何
QUOTE_*
常量(参见模块内容部分),默认值为QUOTE_MINIMAL
。当它说它可以取这些常量中的任何一个时,它隐含地意味着任何其他值都无效。
whlutmcx2#
CSV模块(
cpython/Lib/csv.py
)的CPython源代码从名为_csv
的文件导入常量:我认为
_csv
是一个Python文件,在我的本地安装中找不到它,但它在Modules/csv.c
的源代码中它以编译的形式存在于我的本地安装中,作为共享库二进制文件。
这里是这些常量和整数之间的隐式Map,因为C中的枚举根据定义是存储命名整数的数据类型。
Python中的enum module中的等价物没有太大的不同。如果我创建一个枚举:
我可以引用
Color.RED
,也可以引用一个整数,例如Color(1)
。这就解释了“如何”。至于为什么它是无证的,正如其他人在这里说的,我猜它不打算被使用。Pandas的
read_csv
依赖于此,默认值为quoting=0
,这有点令人惊讶。但是Pandas,像Numpy一样,与CPython紧密耦合,因为它依赖于大量的C代码,所以依赖CPython实现的特定怪癖可能是有意义的。在我的机器上(MacOS上的Homebrew Python),它在
/opt/homebrew/Cellar/ [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection) /3.11.4_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/lib-dynload/_csv.cpython-311-darwin.so
中