什么是在CSV文件中存储和检索布尔值的便捷方法

时间:2010-09-15 12:57:45

标签: python

如果我使用CSV模块存储布尔值,它将被str()函数转换为字符串'True'或'False'。但是当我加载这些值时,一个'False'字符串的计算结果为True,因为它是一个非空字符串。

我可以通过'manualy'来解决它在读取时使用IF语句检查字符串以查看字符串是什么,但它有点不太优雅。任何更好的想法,或者这只是编程世界中的其中一个?

5 个答案:

答案 0 :(得分:4)

我不认为Python的csv模块可以实现这一点。然而...

通过说您从Python编写和读取CSV文件,您承认使用CSV文件进行某种数据序列化。你为什么想这么做?有许多更好的选项可用于序列化Python数据,而且我们可以保留CSV文件以便与其他需要它们的工具进行交互。

答案 1 :(得分:0)

使用int()函数将布尔值转换为它们的int值,然后存储它们。话虽如此,eli-bendersky上面的评论值得注意。

答案 2 :(得分:0)

我不确定回答你自己的问题是不是坏形式,但这是我提出的解决方案。它基本上包括将我讨论的那个讨厌的IF语句放到一个函数中。

def setyesNo(value):
    if value: return 'Yes'
    else: return 'No'

def checkYesNo(text):
    if text == 'Yes': return True
    else: return False

然后在我的dictWriter中这样做。

for item in mylist:
    writer.writerow( {'Is Cool' : setYesNo(item.is_cool),
                      .....
                      })

在dictReader中。

for line in reader:
    item MyObject(is_Cool=checkYesNo(line['Is Cool']),
                  .....
                  )
    mylist.append(item)

答案 3 :(得分:0)

将布尔值存储在CSV文件中的方法

  • 字符串:truefalseTrueFalse这两个常见的选择,但我也看到过yesno
  • 整数:01
  • 浮点数:0.01.0

让我们比较各自的优点/缺点:

  • 字符串:
    • +人们可以阅读
    • - CSV读取器会将其作为字符串,并且将bool应用于它时,两者都将得出“ true”
  • 整数:
    • + CSV读者可能会看到此列为整数,并且bool(0)的计算结果为false。
    • +更加节省空间
    • -尚不清楚它是布尔值
  • 浮点数:
    • + CSV读者可能会看到此列为整数,并且bool(0.0)的计算结果为false。
    • -尚不清楚它是布尔值
    • +可能为空(如NaN)

Pandas CSV阅读器显示了所描述的行为。

将布尔字符串转换为布尔值

看看mpu.string.str2bool

>>> str2bool('True')
True
>>> str2bool('1')
True
>>> str2bool('0')
False

具有以下实现:

def str2bool(string_, default='raise'):
    """
    Convert a string to a bool.

    Parameters
    ----------
    string_ : str
    default : {'raise', False}
        Default behaviour if none of the "true" strings is detected.

    Returns
    -------
    boolean : bool

    Examples
    --------
    >>> str2bool('True')
    True
    >>> str2bool('1')
    True
    >>> str2bool('0')
    False
    """
    true = ['true', 't', '1', 'y', 'yes', 'enabled', 'enable', 'on']
    false = ['false', 'f', '0', 'n', 'no', 'disabled', 'disable', 'off']
    if string_.lower() in true:
        return True
    elif string_.lower() in false or (not default):
        return False
    else:
        raise ValueError('The value \'{}\' cannot be mapped to boolean.'
                         .format(string_))

答案 4 :(得分:0)

几乎总有一种更简单(通常更方便)的方法,而且大多数情况下它已经包含在 Python 令人惊叹的标准库中。

在这种情况下,您可以只使用 TrueFalse,然后使用 astliteral_eval 方法解析它们。

假设我们有一个名为 test.csv 的文件,其内容如下:

nonetype,integer,boolean
None,123,False

我们还有一个 test.py 脚本来解析文件:

import ast
import csv

with open('test.csv', 'r') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        nonetype = ast.literal_eval(row['nonetype'])
        integer = ast.literal_eval(row['integer'])
        boolean = ast.literal_eval(row['boolean'])
        print(type(nonetype), type(integer), type(boolean))

当我们运行脚本时,我们可以看到值按预期解析。

$ python3 test.py
<class 'NoneType'> <class 'int'> <class 'bool'>

此方法也可以安全使用,即使输入来自不受信任的来源,更多信息on the docs