簡體   English   中英

將字符串列表(csv)轉換為浮點列表

[英]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來跳過標題,這意味着我們從第二行開始。 然后,我們使用列表推導從迭代器中生成一個新列表,其中包含另一個列表推導,如果這些值存在且不在YearAnnual列中,則生成這些值的浮點數。 為此,我們使用內置的enumerate()來獲取我們所在的列的編號,然后進行檢查以確保其不是0Year )或13Annual )。

作為JFSebastian在評論中指出,最好的解決辦法是允許csv模塊來處理與數字打交道的您,加入命名參數quotingcsv.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM