亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 DictReader 從 python 中的 csv 行“作為列表”讀取列表

使用 DictReader 從 python 中的 csv 行“作為列表”讀取列表

翻過高山走不出你 2023-05-16 14:27:39
我的 CSV 文件如下所示:    id,name,list    1,Beans,[1,2,3]    2,Spam,[5,6,7]    5,Spam,[7,8,9]當我嘗試使用以下代碼閱讀最后一列時:with open('some.csv', newline='') as csvfile:     reader = csv.DictReader(csvfile)     for row in reader:         print(row["list"])我得到的輸出是:[1[5[7顯然,它在第一個 ',' 處分隔列表。但是我希望它將整個列表作為一列來閱讀。所以我的預期輸出是:[1,2,3][5,6,7][7,8,9]我計劃將這些中的每一個存儲在變量中,以便它們可以像我使用普通列表迭代它或執行其他任務一樣使用。我如何實現這一目標?
查看完整描述

4 回答

?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

  • 問題是 CSV 格式不正確,列表周圍用雙引號引起來

    • list是 python 數據類型,所以它不應該用作變量名。

    • lists通過將列用雙引號?引起來修復 CSV 文件

  • 使用此解決方案pandas

    • ast.literal_eval將字符串評估回列表

import pandas as pd

from ast import literal_eval


# fix the csv file by wrapping the list with quotes

with open('test.csv', 'r+', newline='') as f:

? ? rows = [s.replace(',[', ',"[').replace(']', ']"').strip() for s in f.readlines()]

? ? f.seek(0)

? ? f.truncate()

? ? f.writelines(s + '\n' for s in rows)



# read the csv and evaluate the list column as lists

df = pd.read_csv('test.csv', converters={'lists': literal_eval})


# display(df)

? ?id? ?name? ? ? lists

0? ?1? Beans? [1, 2, 3]

1? ?2? ?Spam? [5, 6, 7]

2? ?5? ?Spam? [7, 8, 9]

3? ?6? Steak? ? ? ? ?[]


print(type(df.loc[0, 'lists']))

[out]:

list

with open

# converts

id,name,lists

1,Beans,[1,2,3]

2,Spam,[5,6,7]

5,Spam,[7,8,9]

6,Steak,[]


# into

id,name,lists

1,Beans,"[1,2,3]"

2,Spam,"[5,6,7]"

5,Spam,"[7,8,9]"

6,Steak,"[]"


查看完整回答
反對 回復 2023-05-16
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

如果您無法更改輸入文件,您仍然可以使用以下代碼處理列表列 -


with open('test.csv', newline='') as csvfile:

    reader = csv.DictReader(csvfile)

    stringVal = ","

    for row in reader:

        newList = row['list'] + "," + stringVal.join(row[None])

        print(newList)



查看完整回答
反對 回復 2023-05-16
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

您可以像這樣引用您的 csv 文件:


"id","name","list"

"1","Beans","[1,2,3]"

"2","Spam","[5,6,7]"

"5","Spam","[7,8,9]"

然后您可以使用csv帶有可選參數的模塊來讀取它quoting=csv.QUOTE_ALL。在此之后,您可以將這些“字符串列表”轉換為常規列表。例如,如果這些“字符串列表”只是數字,那么您可以過濾結果,然后將其轉換為整數。這是代碼:


import csv


with open('test.csv', 'r') as fh:

    data = list(csv.reader(fh, quoting=csv.QUOTE_ALL))

    for i in range(1, 4):

      data[i][2] = list(filter(lambda c: str.isnumeric(c), data[i][2]))

      data[i][2] = list(map(lambda c: int(c), data[i][2]))

    print(*data, sep='\n')

結果:


['id', 'name', 'list']

['1', 'Beans', [1, 2, 3]]

['2', 'Spam', [5, 6, 7]]

['5', 'Spam', [7, 8, 9]]


查看完整回答
反對 回復 2023-05-16
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

問題與您的 csv 文件有關。如果那是實際文件的樣子,那么它將按照您說的那樣進行。將列表用雙引號括起來,如下所示:


    id,name,list

    1,Beans,"[1,2,3]"

    2,Spam,"[5,6,7]"

    5,Spam,"[7,8,9]"


查看完整回答
反對 回復 2023-05-16
  • 4 回答
  • 0 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號