我在将这个字符串列表转换为浮点列表时遇到了一些困难。我尝试了这两种方法,每种方式都返回了不同的错误。
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
答案 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文件中获取数据。我们通过将迭代器推进一个来跳过标题,这意味着我们从第二行开始。然后,我们使用列表推导从迭代器生成一个新列表,其中包含另一个列表推导,如果这些值存在,则生成值的浮点数,并且不在Year
或Annual
列中。为此,我们使用enumerate()
内置来获取我们所在列的编号,然后进行检查以确保它不是0
(Year
)或13
( Annual
)。
正如JFSebastian在评论中指出的那样,最好的解决方案是允许csv
模块通过向{{1}添加命名参数quoting
来处理为您处理的数字。使用值csv.reader()
调用。 E.g:
csv.QUOTE_NONNUMERIC