0

我在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 的类函数。我不熟悉 chartypes 但遵循所有其他方法,似乎最终 infile 被 .decode(不同类型的东西)解码返回。

4

1 回答 1

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 条件。

于 2012-12-27T13:58:49.003 回答