Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t Python';s len(readlines)等于Bash';s';wc-l';指挥部?_Python_Bash - Fatal编程技术网

为什么';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()))