为什么';t Python';s len(readlines)等于Bash';s';wc-l';指挥部?
对于一些大文件为什么';t Python';s len(readlines)等于Bash';s';wc-l';指挥部?,python,bash,Python,Bash,对于一些大文件 lines_a = len(fa.readlines()) print(lines_a) 对于Bash(在Mac上): 结果不一样 可能的原因是什么?wc-l打印输入。换句话说,它在“行计数”中对“行”的定义要求行以换行结束,实际上是 如果文件中的最后一行没有以换行符结尾,那么此行定义可能会产生令人惊讶的行为。尽管这样的行在文本编辑器和寻呼机中显示得很好,wc不会将其计为一行。例如: $ printf 'foo\nbar\n' | wc -l 2 $ printf 'foo\n
lines_a = len(fa.readlines())
print(lines_a)
对于Bash(在Mac上):
结果不一样
可能的原因是什么?
wc-l
打印输入。换句话说,它在“行计数”中对“行”的定义要求行以换行结束,实际上是
如果文件中的最后一行没有以换行符结尾,那么此行定义可能会产生令人惊讶的行为。尽管这样的行在文本编辑器和寻呼机中显示得很好,wc
不会将其计为一行。例如:
$ printf 'foo\nbar\n' | wc -l
2
$ printf 'foo\nbar' | wc -l
1
另一方面,Python的readlines()
方法旨在提供文件中的数据,以便能够完美地重建文件。因此,它为每一行提供最终换行符,并按原样提供最后一个非空行(有或没有最终换行符)。对于上面的示例,它分别返回长度为2的列表[“foo\n”,“bar\n”]
和[“foo\n”,“bar”]
:
$ printf 'foo\nbar' | python -c 'import sys; print len(sys.stdin.readlines())'
2
$ printf 'foo\nbar\n' | python -c 'import sys; print len(sys.stdin.readlines())'
2
我在做机器翻译的时候遇到了类似的问题。行号不正确的主要原因可能是您没有在“b”模式下打开文件。 所以试着
with open('some file', 'rb') as f:
print(len(f.readlines()))
您将得到与
wc-l
相同的号码。如果您的文本文件中有\r,也可能会出现这种情况
从流中读取输入时,如果换行符为None,则为universal
已启用换行符模式。输入中的行可以以'\n'、'\r'或'\n'结尾
“\r\n”,并在返回到之前将其转换为“\n”
打电话的人
^从python中,您给了我一个合理的解释,但是我得到了一个大文件,数百万行,与“wc-f”和“len(readlines())”的结果不同,但是,我通过脚本检查这个文件,每行在行尾只包含一个“\n”,所以我想肯定还有另一个原因,你还有什么想法吗?或者我应该问一下,python中有没有一种方法可以把像“aaa\nbbb”这样的行当作一行来处理?@AndyYuan抱歉,我不知道wc-f的作用是什么。另外,如果文件太大,可能是在
wc
运行时写入的,这可以解释差异。@user4815162342对不起,我的错误应该是“wc-l”,我的问题是python是否有一个函数将类似“aaa\nbbb\n”这样的行作为一行line@AndyYuan“aaa\nbbb\n”是两行。如果你想“把它当作一行”,你怎么知道什么时候该停止阅读?Python文件对象有一个read()
方法,该方法以字符串形式返回整个文件内容;也许您可以使用它,然后根据需要拆分结果字符串。
with open('some file', 'rb') as f:
print(len(f.readlines()))