我在将这个字符串列表转换为浮点数列表时遇到了一些困难。我尝试了这两种方法,每种方法都返回了不同的错误。
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发布于 2012-06-18 09:45:02
您在第一个示例中遇到的问题是,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文件中获取数据。我们通过将迭代器前进一来跳过标题,这意味着我们从第二行开始。然后,我们使用列表理解从迭代器生成一个新的列表,其中包含另一个列表理解,如果这些值存在并且不在Year或Annual列中,则生成这些值的浮点数。为此,我们使用enumerate()内置函数来获取所在列的编号,然后进行检查以确保它不是0 (Year)或13 (Annual)。
正如J.F.Sebastian在注释中指出的,最好的解决方案是让csv模块为您处理数字,方法是将命名参数quoting添加到值为csv.QUOTE_NONNUMERIC的csv.reader()调用中。例如:
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)https://stackoverflow.com/questions/11076138
复制相似问题