将"True"和"False"转换为 Python 布尔值,但保留其他字符串不变



我正在研究一个使用Flask-SQLAlchemy的应用程序,它需要以.csv格式导入和导出数据。我有导出功能工作,但我在导入时遇到了一个障碍。

简而言之,我要找一个通用的方法导入字符串"True"one_answers";False"作为布尔值,但任何其他字符串值作为其本身。这样做的原因是csv.DictWriter将布尔值呈现为它们的字符串等效物,并且我需要将结果文件导入回数据库。

我试过ast.literal_eval(),但它抛出一个ValueError,如果我给它除了"True"或";False"。我可以测试列名,但当然,一旦我更改了模式,这种测试就会中断。我想使用成语

reader = csv.DictReader(fh)
...
for row in reader:
...
contact = Contact.query.get(row['id'])
for key, value in row.items():
setattr(contact, key, value)
谁能建议一个方法来实现我想要完成的?

读取CSV时,循环遍历所有列,并将字符串替换为相应的值。

csv_data = []
with open("file.csv") as f:
csv_f = csv.reader(f)
for row in csv_f:
for i, col in enumerate(row):
if col == "True":
row[i] = True
elif col == "False":
row[i] = False
csv_data.append(row)

你为什么不用熊猫来读写呢?您可以使用as_type()方法轻松地转换列

更新:假设test.csv

1,True,sada
2,False,asda
3,False,afaff
4,True,agwe

读取CSV
import pandas as pd
data = pd.read('text.csv', header=None)

检查数据:

print(data.head())
0      1      2
0  1   True   sada
1  2  False   asda
2  3  False  afaff
3  4   True   agwe

检查类型:

print(data.dtypes)
0     int64
1      bool
2    object
dtype: object

将列转换为字符串、整数或布尔值:

data[1].as_type(str)
data[1].as_type(int)
data[1].as_type(bool)

根据Barmar上面的回答,我尝试了

for row in reader:
if not row['id']:
contact = Contact(**row)
db.session.add(contact)
else:
contact = Contact.query.get(row['id'])
for key, value in row.items():
if value == "True":
value = True
if value == "False":
value = False
if value == '':
value = None
setattr(contact, key, value)

但后来我意识到我应该在我的模型中这样做,在@validates方法中:

class Contact(db.Model):
...
@validates('blacklisted', 'disabled', 'is_member')
def string_to_bool(self, key, value):
if isinstance(value, bool):
return value
if value == "True":
return True
if value == "False":
return False
if value is not None and re.match("^s*$", value) is not None:
return None
return value

这将所有的类型匹配代码放在一个最相关的地方。

相关内容

  • 没有找到相关文章

最新更新