[英]converting a list of strings(csv) to a list of floats
我在將此字符串列表轉換為浮點數列表時遇到一些困難。 我嘗試了兩種方法,每種方法均返回不同的錯誤。
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
您在第一個示例中遇到的問題是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來跳過標題,這意味着我們從第二行開始。 然后,我們使用列表推導從迭代器中生成一個新列表,其中包含另一個列表推導,如果這些值存在且不在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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.