【问题标题】:All values converted to strings when reading csv读取 csv 时将所有值转换为字符串
【发布时间】:2021-05-12 01:15:46
【问题描述】:

我有一个 CSV 文件 (https://easyupload.io/fehzj5),我必须在 python 中分析它。 为了处理数据,我将其转换为列表列表:

import csv


def read_dataset(file):
    rows = []
    with open(file, 'r') as csvfile:
        csvreader = csv.reader(csvfile, delimiter=',')
        for row in csvreader:
            rows.append(row)
    return rows

CSV 文件完全由浮点数组成,我通过在文本编辑器中打开文件进行了仔细检查。 但是,每当我从read_dataset 的输出中调用一个值时,它始终是浮点类型。

例如

我认为问题出在我的read_datasetcode 某处。非常感谢任何帮助!

【问题讨论】:

  • 我建议您使用比嵌套列表更集中的东西进行分析。 PANDAS 可能是个不错的选择。
  • 旁注:1)delimiter默认为',',所以不需要指定。 2)您可以简化为return list(csvreader),而不是使用rows

标签: python python-3.x csv


【解决方案1】:

CSV 文件中的数值数据以字符串形式存储。这里没有发生“转换为字符串”操作,因为数据已经是一个字符串。 csv.reader() 无法知道哪些单元格是数字的,因此它不会将任何内容转换为浮点数。你需要自己做。

【讨论】:

  • 实际上csv.reader() 确实有办法知道哪些单元格是数字的。有一个 quoting 标志可以指示未引用的字段是浮动的。由于 OP 的数据都是浮点数,因此有效。
  • @MarkTolonen 我不熟悉这个参数。感谢您指出!也许更准确地说是“您在此处创建的阅读器实例是愚蠢的,不知道哪些单元格是浮动的。”
【解决方案2】:

您可以使用pandas方法read_csv然后将您的标头的数据类型指定为float,然后转换数据帧

import pandas as pd
import numpy as np

def read_dataset(file):    
    dtype_data = {'col1': np.float64, 'col2': np.float64}
    df = pd.read_csv(file, delimiter=",", dtype=dtype_data)
    return df

【讨论】:

  • 您甚至不需要指定数据类型。如果值看起来像浮点数,它们将自动转换。同样delimiter 默认为',',所以你不需要指定它。
【解决方案3】:

来自documentation

csv.<strong>QUOTE_NONNUMERIC</strong>
指示 writer 对象引用所有非数字字段。

指示读者将所有未加引号的字段转换为浮点类型。

由于您的示例数据都是未引用的浮点数:

import csv

with open('downloads/stackoverflow_data.csv') as csvfile:
    csvreader = csv.reader(csvfile,quoting=csv.QUOTE_NONNUMERIC)
    rows = list(csvreader)

print(rows[0][:10])

输出:

[693.366, 692.038, 690.964, 690.964, 689.796, 687.634, 686.228, 685.072, 685.072, 683.856]

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2010-09-09
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多