【问题标题】:I am moving from Python 2.7 to Python 3 and .split is acting up [closed]我正在从 Python 2.7 迁移到 Python 3,并且 .split 正在运行 [关闭]
【发布时间】:2017-11-03 16:37:23
【问题描述】:

提示:

编写一个程序,根据哪一天对每封邮件进行分类 提交完成的那一周。为此,请查找开始的行 使用“from”,然后查找第三个单词并保持运行计数 一周中的每一天。在程序结束时打印出 字典的内容(顺序无关紧要)。

Python 3 中的代码:

fname = input('enter file name:')
fhand = None
days = dict()

try:
    fhand = open(fname)
except:
    print(fname, 'is not a file thank you have a nice day and stop trying to ruin my program\n')
    exit()

for line in fhand:
    sline = line.split()
    if line.startswith('From'):
        print (sline)
        day = sline[2]
        if day not in days:
            days[day] = 1
        else:
            days[day] += 1
print(days)

问题:

['From', 'stephen.marquard@uct.ac.za', 'Sat', 'Jan', '5', '09:14:16', '2008']
**['From:', 'stephen.marquard@uct.ac.za']**
Traceback (most recent call last):
  File "C:\Users\s_kestlert\Desktop\Programming\python\chap9.py", line 13, in <module>
    day = sline[2]
IndexError: list index out of range

文件:http://www.py4inf.com/code/mbox-short.txt

为什么.split 将线路缩减为仅[0][1]

我该如何规避这个问题?

【问题讨论】:

  • 能否提供示例文件内容?
  • 您确定这是您执行的代码吗?因为print 似乎表明sline 有7 个元素,并且您在下一行进行索引。
  • 看起来您有一行仅由 From: stephen.marquard@uct.ac.za 组成。拆分时,结果列表包含两个元素,因此有效索引为 0 和 1。您不能在只有两个元素的列表上使用索引 2。
  • Acting up”并不是一个真正的技术术语..

标签: python python-3.x python-2to3


【解决方案1】:

查看您链接的文件,我认为您需要将line.startswith('From') 更改为line.startswith('From ')(注意尾随空格)。 From: ... 标题行正在匹配(并且只有 2 个字),而我认为您只想要包含更多信息的 From ... 行。

【讨论】:

  • 这是我最后的手段,其他 6 人也看过这个。这是一个巨大的解脱,非常感谢!
  • @ThomasK。没问题。请记住,您的方法仍然相当脆弱(如果消息正文的一行恰好以 From 开头怎么办)但对于您的特定情况可能没问题。对于更健壮的东西,您可以尝试将内容分成组件消息(看起来像 3 个连续的换行符后跟From,但这可能不足以满足所有输入),然后取每个块的第一行。此外,不确定这些消息中是否有任何敏感内容,但您可能希望删除该文件并移除链接。
【解决方案2】:

你的程序崩溃了

From: stephen.marquard@uct.ac.za

稍后出现(第 38 行),而不是文件的第一行。

在尝试从中获取日期字段之前,请检查以确保 sline 有足够的元素。

【讨论】:

    【解决方案3】:

    对于文件file.txt

    From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
    From: stephen.marquard@uct.ac.za
    

    你的程序输出

    enter file name:file.txt
    ['From', 'stephen.marquard@uct.ac.za', 'Sat', 'Jan', '5', '09:14:16', '2008']
    ['From:', 'stephen.marquard@uct.ac.za']
    Traceback (most recent call last):
      File "test.py", line 13, in <module>
        day=sline[2]
    IndexError: list index out of range
    

    这是因为第二行没有第三个单词。您需要在程序中实现错误控制。

    【讨论】:

    • 我认识到我的程序将其缩减为只有 2 个单词的列表。我想知道为什么,因为我不知道为什么它会减少它。从 ['From', 'stephen.marquard@uct.ac.za', 'Sat', 'Jan', '5', '09:14:16', '2008'] 到 ['From:', ' stephen.marquard@uct.ac.za'] 在打印期间,我不希望它这样做,我正在寻找它为什么这样做。
    • 您的测试文件中必须有第二行。我正在运行你的程序。您会看到它不会在第一行崩溃。
    • 我现在看到你已经添加了你的输入文件。正如我在回答中提到的,不是第一行导致程序崩溃,而是下一行以 From 开头。
    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 2019-09-06
    • 1970-01-01
    • 2016-06-17
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多