0

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

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
4

1 回答 1

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语句以可读和 Python 的方式打开文件(确保文件正确关闭,即使在异常情况下也是如此)。然后csv.reader我们从 CSV 文件中获取我们的数据。我们通过将迭代器前进一个来跳过标题,这意味着我们从第二行开始。然后,我们使用列表推导从迭代器中生成一个新列表,其中包含另一个列表推导,如果这些值存在且不在YearorAnnual列中,则生成这些值的浮点数。为此,我们使用enumerate()内置函数获取我们所在列的编号,然后检查以确保它不是0( Year) 或13( Annual)。

正如 JFSebastian 在评论中指出的那样,最好的解决方案是允许csv模块为您处理数字,方法是将命名参数添加quotingcsv.reader()带有 value 的调用中csv.QUOTE_NONNUMERIC。例如:

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

print(floats)
于 2012-06-18T01:45:01.973 回答