2012-06-18 65 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