【问题标题】:Why is my Python CSV code reading in each row as a string?为什么我的 Python CSV 代码在每一行中读取为字符串?
【发布时间】:2020-01-29 15:46:52
【问题描述】:

我正在从事 Code Academy 课程的衍生项目,并在尝试将特定列从 CSV 的每一行附加到列表时遇到错误。

课程代码

import csv

with open('cool_csv.csv') as cool_csv_file:
  cool_csv_dict = csv.DictReader(cool_csv_file)
  for row in cool_csv_dict:
    print(row['Cool Fact'])

我需要从我的 CSV 中读取每一行,并将“主题”列的值附加到条目列表中。

import csv

entries = []

with open("list.csv") as list_csv:
  list_reader = csv.DictReader(list_csv)
  for row in list_csv:
    entries.append(row["subject"])

但我收到以下错误:

entries.append(row[“subject”]) TypeError: 字符串索引必须是整数

我得到错误是说按行传递的值是一个字符串,所以我不能用标题名称访问它,但我不明白为什么。据我所知,我的文件是一个有效的 CSV,我的代码与课程中的代码没有什么不同,除了追加而不是打印(我测试了打印,同样的错误。)

我的 CSV:

subject,subject_type
first,test
second,test

我做错了什么让我的代码以字符串而不是 csv 行读取?

【问题讨论】:

  • 尝试list_reader,而不是list_csv
  • 我投票关闭这个,因为题外话/错字/无法复制。这本质上是一个错字,一个微不足道的混淆。

标签: python python-3.x list csv


【解决方案1】:

你需要循环阅读器

  for row in list_csv:
      entries.append(row["subject"])

您错误地循环了 list_csv。

【讨论】:

  • Doh,现在很明显?谢谢
【解决方案2】:

正如@AlirezaTajadod 所说,你正在迭代一个坏对象,你必须迭代list_reader

with open("list.csv") as list_csv:
  list_reader = csv.DictReader(list_csv)
  for row in list_reader:
    entries.append(row["subject"])

【讨论】:

    【解决方案3】:

    需要使用list_reader 而不是list_csv。请参阅以下示例文件 ma​​rks.csv

    id,subject,marks
    1,English,20
    2,French,21
    3,Spanish,21
    

    所以我们有,

    import csv
    list_reader = csv.DictReader(open("marks.csv"))
    

    您可以通过迭代 list_reader 来迭代 CSV 文件的行。因此,如果我们执行如下的 for 循环

    for row in list_reader:
        print row
    

    它会像这样打印行,

    {'id': '1', 'subject': 'English','marks': '20' }
    {'id': '2', 'subject': 'French', 'marks': '21' }
    {'id': '3', 'subject': 'Spanish','marks': '22' }
    

    现在要获取主题值,只需打印row['subject']

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多