Python的readline()与Java Scanner类的nextLine()区别
Python的readline()和Java的Scanner类中的nextLine()有什么区别呢?
nextLine()会寻找下一个行分隔符,这个分隔符可能不仅仅是"\n",具体可以参考这里:
http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextLine()
那么,Python的readline()方法也是这样吗?这点很重要,因为我的文件可能有其他的行分隔符,但我需要特别寻找换行符。
有没有什么想法呢?
2 个回答
你应该自己测试一下。
我在控制台上用 f.readline()
测试过,它会读取到 \n
为止,即使这一行里面有 \r
。
>>> f.readline()
'This is a test\n'
>>> f.readline()
'Second line\rwith char\n'
>>> f.readline()
'Third line'
注意: 如果你直接在 Python 脚本中打印读取的行,可能会出现一些奇怪的情况。但如果你使用 repr(str)
,你就能看到所有的 \n
和 \r
。
首先,你在比较苹果和橘子。Scanner
其实并不是 Java 中和 Python 文件对象相等的东西。BufferedReader
才是它的对应物。实际上,如果你查看 BufferedReader
的 nextLine
方法的说明,你会发现:
这个方法用来读取一行文本。一行的结束可以是换行符(
'\n'
)、回车符('\r'
),或者是回车符后面紧跟着换行符。
Python 也有类似的处理方式:它会这样做:
在处理文本流时,以下所有情况都被认为是行的结束:Unix 的换行符
'\n'
、Windows 的换行符'\r\n'
,以及旧版 Macintosh 的换行符'\r'
。你可以查看 PEP 278 和 PEP 3116,以及str.splitlines()
的其他用法。
据我所知,Python 并没有一个和 Java 的 Scanner
相对应的公开版本。不过,确实有一个(未文档化的)re.Scanner
,可以用来实现你想要的功能。你只需在创建实例时提供一个“词汇表”,然后调用 scan
方法。
实现你想要的功能,最简单的方法可能是分块读取文件,然后使用 re.split
来拆分。