Python中的行读取,列为变量的行被视为整数?

时间:2012-12-27 13:03:30

标签: python python-3.x typeerror

我在 python 3.2

中有这段代码
infile = self._handle_bom(infile)
for line in infile:
    if (not line) or (line[-1] not in ('\r', '\n', '\r\n')):   # <- error here
        continue
    for end in ('\r\n', '\n', '\r'):
        if line.endswith(end):
            self.newlines = end
            break
    break

出错:

TypeError: 'int' object is not subscriptable

为什么python将line视为int?

修改 好吧,看起来我的方式比较复杂。

_handle_bom是一个处理BOM的类函数。我不熟悉图表类型但是遵循所有其他方法似乎最终infile被返回为.decode解码(不同类型的东西)。

1 个答案:

答案 0 :(得分:1)

毫无疑问,您的问题实际上在_handle_bom例程中。

但这种逻辑也是多余的。

if (not line) or (line[-1] not in ('\r', '\n', '\r\n')):

即“如果该行为空(或无,或0,或[]或{})或不以换行符结尾,则继续循环”

for end in ('\r\n', '\n', '\r'):
    if line.endswith(end):
        break

这复制了前一个if语句的后半部分。


除此之外,这段代码实际上回答了这个问题:

  

此文件中第一个非空白行以哪种换行符结尾?

可以像这样重写:

def get_newline_type(self, lines):
    for line in lines:
        if line:
            # Prevents your TypeError, but your BOM code probably shouldn't be
            # returning non-string lines anyway?
            line = str(line) 
            newline_types = filter(lambda x: line.endswith(x), ('\r\n', '\r', '\n'))
            if newline_types:
                return newline_types[0]
            else:
                return None

然后你可以简单地这样称呼它:

self.newline_type = self.get_newline_type(self._handle_bom(infile))

当然还有另一个问题 - 如果第一个非空行没有结束,你真的希望self.newlines为None(或者在你的情况下,无论在调用代码之前设置的是什么)与'\r\n', '\n', or '\r'?如果没关系,因为永远不会有这些行之一,或者你确实想要EOL字符,只需删除else条件。