如果我使用CSV模块存储布尔值,它将被str()函数转换为字符串'True'或'False'。但是当我加载这些值时,一个'False'字符串的计算结果为True,因为它是一个非空字符串。
我可以通过'manualy'来解决它在读取时使用IF语句检查字符串以查看字符串是什么,但它有点不太优雅。任何更好的想法,或者这只是编程世界中的其中一个?
答案 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)
true
和false
,True
和False
这两个常见的选择,但我也看到过yes
和no
。0
或1
0.0
或1.0
让我们比较各自的优点/缺点:
+
人们可以阅读-
CSV读取器会将其作为字符串,并且将bool
应用于它时,两者都将得出“ true” +
CSV读者可能会看到此列为整数,并且bool(0)
的计算结果为false。+
更加节省空间-
尚不清楚它是布尔值+
CSV读者可能会看到此列为整数,并且bool(0.0)
的计算结果为false。-
尚不清楚它是布尔值+
可能为空(如NaN)Pandas CSV阅读器显示了所描述的行为。
>>> 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 令人惊叹的标准库中。
在这种情况下,您可以只使用 True
和 False
,然后使用 ast
的 literal_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。