在csv模块中使用整数作为“引号”参数

muk1a3rh  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(101)

csv模块定义了常量QUOTE_ALLQUOTE_MINIMALQUOTE_NONNUMERICQUOTE_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?这是如何工作的,是否有记录?

uelo1irk

uelo1irk1#

此行为记录在Dialect.quoting的描述中:
它可以接受任何QUOTE_*常量(参见模块内容部分),默认值为QUOTE_MINIMAL
当它说它可以取这些常量中的任何一个时,它隐含地意味着任何其他值都无效。

whlutmcx

whlutmcx2#

CSV模块(cpython/Lib/csv.py)的CPython源代码从名为_csv的文件导入常量:

from _csv import QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC...

我认为_csv是一个Python文件,在我的本地安装中找不到它,但它在Modules/csv.c的源代码中

typedef enum {
    QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE,
    QUOTE_STRINGS, QUOTE_NOTNULL
} QuoteStyle;

它以编译的形式存在于我的本地安装中,作为共享库二进制文件。
这里是这些常量和整数之间的隐式Map,因为C中的枚举根据定义是存储命名整数的数据类型。
Python中的enum module中的等价物没有太大的不同。如果我创建一个枚举:

from enum import Enum

Color = Enum('Color', ['RED', 'GREEN', 'BLUE'])

我可以引用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

相关问题