4 回答

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,"[]"

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)

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]]

TA貢獻1841條經驗 獲得超3個贊
問題與您的 csv 文件有關。如果那是實際文件的樣子,那么它將按照您說的那樣進行。將列表用雙引號括起來,如下所示:
id,name,list
1,Beans,"[1,2,3]"
2,Spam,"[5,6,7]"
5,Spam,"[7,8,9]"
添加回答
舉報