当我从 CSV 文件读回数据时,每个单元格都被解释为字符串。
- 如何自动将读入的数据转换为正确的类型?
- 或者更好:我如何告诉 csv 阅读器每列的正确数据类型?
(我写了一个二维列表,其中每一列都有不同的类型(bool、str、int、整数列表),输出到 CSV 文件。)
示例数据(CSV 文件中):
IsActive,Type,Price,States
True,Cellphone,34,"[1, 2]"
,FlatTv,3.5,[2]
False,Screen,100.23,"[5, 1]"
True,Notebook, 50,[1]
As the 文档解释,CSV 阅读器不执行自动数据转换。您有 QUOTE_NONNUMERIC 格式选项,但这只会将所有非引用字段转换为浮点数。这与其他 csv 读取器的行为非常相似。
我不相信 Python 的 csv 模块对这种情况有任何帮助。正如其他人已经指出的那样,literal_eval()
是一个更好的选择。
以下内容确实有效并进行转换:
- strings
- int
- floats
- lists
- 字典
您也可以将它用于布尔值和 NoneType,尽管它们必须相应地格式化literal_eval()
通过。 LibreOffice Calc 以大写字母显示布尔值,而在 Python 中布尔值是大写的。另外,您必须将空字符串替换为None
(不带引号)
我正在为 mongodb 编写一个导入器来完成这一切。以下是我迄今为止编写的代码的一部分。
[注意:我的 csv 使用制表符作为字段分隔符。您可能还想添加一些异常处理]
def getFieldnames(csvFile):
"""
Read the first row and store values in a tuple
"""
with open(csvFile) as csvfile:
firstRow = csvfile.readlines(1)
fieldnames = tuple(firstRow[0].strip('\n').split("\t"))
return fieldnames
def writeCursor(csvFile, fieldnames):
"""
Convert csv rows into an array of dictionaries
All data types are automatically checked and converted
"""
cursor = [] # Placeholder for the dictionaries/documents
with open(csvFile) as csvFile:
for row in islice(csvFile, 1, None):
values = list(row.strip('\n').split("\t"))
for i, value in enumerate(values):
nValue = ast.literal_eval(value)
values[i] = nValue
cursor.append(dict(zip(fieldnames, values)))
return cursor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)