如何解决使用DictReader从python中的csv行中读取列表作为列表
我的CSV文件如下:
id,name,list
1,Beans,[1,2,3]
2,Spam,[5,6,7]
5,[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,3]
[5,7]
[7,9]
我计划将每个变量存储在变量中,以便可以使用它们,因为我会使用普通列表对其进行迭代或执行其他任务。
我该如何实现?
解决方法
- 问题是CSV格式不正确,列表两边都有双引号
- 通过将
lists
列用双引号引起来固定CSV文件-
list
是python数据类型,因此永远不要用作变量名。
-
- 通过将
- 将此solution用于
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,3]
2,Spam,[5,7]
5,[7,9]
6,Steak,[]
# into
id,"[1,3]"
2,"[5,7]"
5,"[7,9]"
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)
,
问题与您的csv文件有关。如果那是实际文件的外观,那么它将按照您所说的那样进行。将列表用双引号引起来,如下所示:
id,list
1,3]"
2,7]"
5,9]"
,
您可以这样引用csv文件:
"id","name","list"
"1","Beans",3]"
"2","Spam",7]"
"5",9]"
然后,您可以使用带有可选参数csv
的{{1}}模块进行阅读。
之后,您可以将这些“字符串列表”转换为常规列表。 e.x.如果这些“字符串列表”仅是数字,则可以过滤结果,然后将其转换为整数。这是代码:
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')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。