如何在 Python 中为 csv.reader 设置语言环境?

Posted

技术标签:

【中文标题】如何在 Python 中为 csv.reader 设置语言环境?【英文标题】:How to set locale for csv.reader in Python? 【发布时间】:2021-12-02 19:36:55 【问题描述】:

在 Python 中,当我们使用 csv.readerquoting=csv.QUOTE_NONNUMERIC 时,它会将未加引号的字段转换为文档中指定的浮点数:

从 csv 文件读取的每一行都作为字符串列表返回。不 自动数据类型转换被执行,除非 QUOTE_NONNUMERIC 指定格式选项(在这种情况下不加引号 字段转换为浮点数)。

我写的代码是这样的:

with open(file_path, 'r') as file:
    csv_reader = csv.reader(file, quoting=csv.QUOTE_NONNUMERIC)
    header = next(csv_reader)

    # Read line by line
    while line := next(csv_reader):
        # Further processing here

当文件的语言环境与我的默认语言 en_GB 相同时,数字转换过程可以正常工作。但如果文件中的数据使用逗号作为小数点分隔符(de_DE 语言环境),则代码将中断,因为它无法将该字符串转换为浮点数。

ValueError:无法将字符串转换为浮点数:'0,761843944084108'

那么,我如何告诉csv.reader 使用哪个语言环境?我在打开文件之前尝试使用locale.setlocale(locale.LC_ALL, 'de_DE'),但不知何故它无法识别它,我仍然遇到同样的错误。

de_DE 的示例 CSV 如下所示:

"ID";"Measurement";"Note"
"1";0,23;"Example Value"
"2";1,5;"Another Note"

此文件将导致ValueError,因为0,23 不是en_GB 语言环境中的数字。

csv.reader 设置区域设置的正确方法是什么?

【问题讨论】:

while line := next(csv_reader): 没有。不要那样做。使用for line in csv_reader: ... 感谢您的建议。当我们使用QUOTE_NONNUMERIC 时,csv.reader 将尝试将未加引号的字符串转换为数字。这意味着line 是一个包含数字(来自未引用的字段)和字符串(来自引用的字段)的列表。 locale 不会影响float 的行为,据我所知。您需要使用locale.atof根据您设置的语言环境将字符串转换为浮点数 啊,我明白了,您将不得不不使用该选项并使用 local.atof 手动转换字符串...实际上,我们可以看到部分 csv 吗? 谢谢,如果我不能告诉csv.reader 使用正确的语言环境,我必须自己做... :) 【参考方案1】:

一种可以提供帮助的方法是在处理该数据时使用该函数:

import locale

locale.atof(input)

如果您的区域设置为该文件的 de 以处理这些值,您还可以找到有关该函数的更多信息和更多选项 here。

【讨论】:

以上是关于如何在 Python 中为 csv.reader 设置语言环境?的主要内容,如果未能解决你的问题,请参考以下文章

python3.4读取.csv

使用 Python 的 csv.reader 处理转义引号

如何从python中的CSV文件中的列中选择一个随机值?

python csv 模块reader后转换为列表

Python数据清洗之csv Reader lookup匹配缺失列

Python数据清洗之csv Reader zip匹配与组装