【问题标题】:Error "list indices must be integers or slices, not str" while looping循环时出现错误“列表索引必须是整数或切片,而不是 str”
【发布时间】:2020-12-27 11:07:39
【问题描述】:

我正在尝试仅解析对我的电子邮件的回复,这些回复存储在 CSV 文件中。我正在使用this library,这似乎是为了做到这一点。我的 CSV 列如下所示:

Date    From Name   From Address   To   Subject    Message

我要做的是阅读message列,执行EmailReplyParser.parse_reply(email_message)的清理功能并将其替换为清理后的电子邮件。

这就是我现在拥有的:

from email_reply_parser import EmailReplyParser
import csv

with open('D:/Harry_Potter.csv', encoding="utf8") as inf:
    reader = csv.reader(inf.readlines())

with open('D:/clean.csv', 'w') as outf:
    writer = csv.writer(outf)
    for row in reader:
        EmailReplyParser.parse_reply(row['Message'])
    writer.writerows(reader)

这是我得到的错误:TypeError: list indices must be integers or slices, not str

我该如何解决这个问题?

【问题讨论】:

  • row 是一个列表。您只能使用整数作为列表的索引,而不是字符串(如 'Message')。
  • 也许您的意思是使用csv.DictReader 而不是csv.reader
  • @mkrieger1 我可以尝试替换它,DictReader 看起来更合适。但是,替换字符串的其他逻辑是否正确?
  • 我猜不是。你不使用EmailReplyParser.parse_replywriter.writerows(reader) 的结果似乎没有多大意义。
  • 现在也出现此错误:ValueError: I/O operation on closed file. 我猜是因为文件在解析之前已被读取并关闭。

标签: python csv email


【解决方案1】:

你的循环应该是这样的:

with open('D:/clean.csv', 'w') as outf:
    writer = csv.writer(outf)
    # need to skip the title
    title = reader.__next__()
    for row in reader:
        EmailReplyParser.parse_reply(row[0].split()[-1])
    writer.writerows(reader)

【讨论】:

  • 谢谢!这解决了循环问题,尽管该功能仍未清理电子邮件。 I've uploaded the file here,你能用数据集试试吗?
  • 你得到什么错误?我建议用一个可重现的例子提出一个与电子邮件解析相关的新问题。
  • 我会马上做的。此外,您共享的更正循环应该在我读入这样的文件之后执行:with open('D:/Harry_Potter.csv', encoding="utf8") as inf: reader = csv.reader(inf.readlines()),对吗?
  • 我没有改变那部分的任何东西,所以是的。
  • 我已经对数据集提出了一个新问题here,如果你想看看的话。
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2015-12-09
  • 2021-09-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多