繁体   English   中英

使用 DictReader 从 python 中的 csv 行“作为列表”读取列表

[英]Read a list from a csv row 'as a list' in python using DictReader

我的 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"])

我得到的 output 是:

[1
[5
[7

显然,它在第一个“,”处分隔列表。 但是我希望它将整个列表作为一列读取。 所以我预期的 output 是:

[1,2,3]
[5,6,7]
[7,8,9]

我计划将这些中的每一个存储在变量中,以便可以使用它们,因为我会使用普通列表来迭代它或执行其他任务。

我如何实现这一目标?

  • 问题是 CSV 的格式不正确,列表周围的双引号
    • 修复 CSV 文件,将lists列用双引号括起来
      • list是一个 python 数据类型,所以它不应该被用作变量名。
  • 将此解决方案用于pandas
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,"[]"

如果您无法更改输入文件,您仍然可以使用以下代码处理列表列 -

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,name,list
    1,Beans,"[1,2,3]"
    2,Spam,"[5,6,7]"
    5,Spam,"[7,8,9]"

您可以像这样引用您的 csv 文件:

"id","name","list"
"1","Beans","[1,2,3]"
"2","Spam","[5,6,7]"
"5","Spam","[7,8,9]"

然后您可以使用带有可选参数quoting=csv.QUOTE_ALLcsv模块来阅读它。 在此之后,您可以将这些“字符串列表”转换为常规列表。 例如,如果这些“字符串列表”只是数字,那么您可以过滤结果,然后将其转换为整数。 这是代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM