Jon*_*han 0 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
Run Code Online (Sandbox Code Playgroud)
您在第一个示例中的问题是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)
Run Code Online (Sandbox Code Playgroud)
为了解释,首先我们使用该with语句以可读和pythonic方式打开文件(这确保文件正确关闭,即使在例外情况下也是如此).然后我们创建一个csv.reader从CSV文件中获取数据.我们通过将迭代器推进一个来跳过标题,这意味着我们从第二行开始.然后,我们使用列表推导从迭代器生成一个新列表,包含另一个列表推导,如果这些值存在,则生成值的浮点数,并且不在Year或Annual列中.为此,我们使用enumerate()内置函数来获取我们所在列的编号,然后进行检查以确保它不是0(Year)或13(Annual).
正如JFSebastian在评论中指出的那样,最好的解决方案是允许csv模块处理为您处理的数字,方法是将带有值的参数添加quoting到csv.reader()调用中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)
Run Code Online (Sandbox Code Playgroud)