【问题标题】:AttributeError when taking result of counter, but not with a plain integer获取计数器结果时出现 AttributeError,但不是纯整数
【发布时间】:2012-11-18 23:42:23
【问题描述】:

我正在尝试使用下面的代码来获取文本文件中的总行数。

totallines = 0
for line in infile:
    totallines += 1

它可以工作,并且可以将正确的数字打印到外壳。但是,当我将结果分配给:

item = [0]*totallines

在将给定的行强制为小写时出现 AttributeError:

item[i] = item[i].lower()

但是,如果我删除行计数器,并将其替换为文本文件中的行数。效果很好。

我该如何解决这个问题?

【问题讨论】:

  • 如果item=[0]*totallines,那么item=[0, 0, ..., 0],和item[i] = 0,那么0.lower()应该是什么意思?
  • item=[0] * 24 有效,这让我感到困惑。
  • 好吧,你为什么不发布你的确切代码,lower() 是一个字符串方法,并且只适用于字符串。因此item 必须包含字符串而不是整数。

标签: python attributeerror


【解决方案1】:

听起来您想将输入文件的行转换为小写并将结果存储在数组中。你可以这样做:

with open('myfile.txt', 'r') as infile:
    items = [line.lower() for line in infile]

或者(有点)等价地,(这一行在每一行的末尾去掉“\n”):

with open('myfile.txt', 'r') as infile:
    items = infile.read().lower().splitlines()

注意:不要使用file 作为变量名,因为它会掩盖内置的file 类型。

【讨论】:

  • @Joel Cornett:人们一直使用file,因为它几乎不需要显式引用(因此通常隐藏它并不重要)。
  • @martineau:有道理。我想以类似的方式,我一直使用string,因为我几乎从不导入string 模块。
  • Brian L,这是你的问题,所以你的电话。
【解决方案2】:

item = [0]*totallines 将创建一个长度等于 totallines 的 0 列表。

如果您想将文件复制到列表中并访问给定的行(例如,第六行),您可以这样做:

item = []
for line in infile:
    item.append(line)

print(item[5].lower())

或者,更简洁地说,使用文件对象的内置方法:

item = infile.readlines()
print(item[5].lower())

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2012-08-25
    • 2015-05-30
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多