2012-06-18 140 views
0

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

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

你的问题是什么?一点散文就会很好。示例输入也会非常有用。还有问题。在第一个例子中'float_list'是未定义的。第二,'C'是。请先尝试运行您的示例代码。 –

+0

值得一提的是,您应该尝试在Python中打开文件时使用 [with'语句](http://preshing.com/20110920/the-python-with-statement-by-example) 。这样更具可读性,并且可以消除文件未被关闭的可能性(即使发生异常时也是如此)。 –

+0

嘿感谢您的快速回复,输入为 – Jonathan

回答

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文件获取我们的数据。我们通过将迭代器前进1来跳过标题,这意味着我们从第二行开始。然后,我们使用列表理解从迭代器生成一个新列表,其中包含另一个列表理解,如果这些值存在,则生成值的浮点数,但不在YearAnnual列中。为此,我们使用内建的enumerate()来获得我们所在列的编号,然后进行检查以确保它不是0Year)或13Annual)。

由于J.F.Sebastian在评论中指出,最好的解决办法就是让csv模块来处理与数字打交道的你,通过与价值csv.QUOTE_NONNUMERIC加上命名参数quotingcsv.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) 
+0

谢谢Latty,我想这是什么让我搞砸了,这里是csv文件的第一行是标题,我不太清楚如何绕过那一行来将其余数据转换为浮点数 – Jonathan

+0

@Jonathan这很容易做到。我会更新我的例子。 –

+0

在Python 2中总是使用''rb''作为csv。您可以使用'csv.QOUTE_NONNUMERIC'自动解析数字 – jfs