将字符串列表(csv)转换为浮点列表

时间:2012-06-18 01:41:23

标签: python string floating-point

我在将这个字符串列表转换为浮点列表时遇到了一些困难。我尝试了这两种方法,每种方式都返回了不同的错误。

import csv
import math

unemp_reader = csv.reader(open('unemp.csv', 'rU'))
unemp_lines = list(unemp_reader)

for rows in unemp_lines:     #tried this way, but error tells me indices must be integers 
    i = 1
    for i in rows:
        a = map(float, unemp_lines[i])
        float_list.append(a)
    print float_list

for row in unemp_lines:  #tried this way but the list returned is empty
    y = row[1].split(",")[1:-1]
    float_list = [float(i) for i in y if i]
print float_list

1 个答案:

答案 0 :(得分:6)

您的第一个示例中的问题是for循环不提供索引,它会从列表中提供值。这意味着你的例子根本没有任何意义。

第二个示例获取行中的第二个项目,将其拆分为逗号(无论如何都应由csv模块处理),然后将结果列表的第二个到第二个到最后一个项目。正如我想象的那样,值中没有逗号,这将带有一个元素的[1:-1]列表,返回一个空列表。我真的不明白这里的意图。然后,您也只存储最后一行的数据(每次覆盖float_list)。您似乎在猜测csv模块并使其变得更加困难。

你需要停止过度复杂化:

with open('unemp.csv', 'rb') as data:
    rows = csv.reader(data)
    next(rows) #Skip the headers.
    floats = [[float(item) for number, item in enumerate(row) if item and (1 <= number <= 12)] for row in rows]

print(floats)

为了解释,首先我们使用with语句以可读和pythonic方式打开文件(这确保文件正确关闭,即使在例外情况下也是如此)。然后我们制作csv.reader以从CSV文件中获取数据。我们通过将迭代器推进一个来跳过标题,这意味着我们从第二行开始。然后,我们使用列表推导从迭代器生成一个新列表,其中包含另一个列表推导,如果这些值存在,则生成值的浮点数,并且不在YearAnnual列中。为此,我们使用enumerate()内置来获取我们所在列的编号,然后进行检查以确保它不是0Year)或13Annual)。

正如JFSebastian在评论中指出的那样,最好的解决方案是允许csv模块通过向{{1}添加命名参数quoting来处理为您处理的数字。使用值csv.reader()调用。 E.g:

csv.QUOTE_NONNUMERIC