我在 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解码(不同类型的东西)。
答案 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条件。