python - 从 CSV 文件读取数据并从字符串转换为正确的数据类型,包括整数列表列

标签 python csv python-2.5

当我从 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/

相关文章:

python - Qt TableView 索引在带/不带标题的不同行为

python - 我们如何使用 python 从 ssh 代理运行 tmux

C:如何读取高级的、类似 Excel 的 CSV 文件?

mysql - MongoDB 类型从 NumberLong 更新为 String

python - 如何在 Windows 64 位平台上的 python 2.5 中终止进程?

python - 无法在 ubuntu 终端上运行 hg

bash - 使用 join/awk/sed 合并 CSV 文件

python - 如何将 RFC 2822 日期/时间解析为 Python 日期时间?

Python 2.5 (PyPy) 兼容的网络服务器/框架

python - 新列中的部分字符串切片(或字符串拆分?)