当我从 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]
最佳答案
作为 docs explain ,CSV 阅读器不执行自动数据转换。您有 QUOTE_NONNUMERIC 格式选项,但这只会将所有未引用的字段转换为 float 。这是与其他 csv 阅读器非常相似的行为。
我不相信 Python 的 csv 模块对这种情况有任何帮助。正如其他人已经指出的那样,literal_eval()
是一个更好的选择。
以下确实有效并转换:
- 字符串
- int
- float
- 列表
- 词典
您也可以将它用于 booleans 和 NoneType,尽管必须对它们进行相应的格式化,以便 literal_eval()
才能通过。当在 Python 中 bool 值大写时,LibreOffice Calc 以大写字母显示 bool 值。此外,您必须将空字符串替换为 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
关于python - 从 CSV 文件读取数据并从字符串转换为正确的数据类型,包括整数列表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11665628/