为什么Python的len(readlines)不等于Bash' wc -l'命令?

时间:2017-06-02 06:37:05

标签: python bash

对于某些大文件,

lines_a = len(fa.readlines())
print(lines_a)

对于Bash(在Mac上):

wc -l

结果不同!

可能的原因是什么?

3 个答案:

答案 0 :(得分:7)

wc -l在输入中打印number of newlines。换句话说,它在“行数”中对“行”的定义要求行以换行结束,实际上是defined by POSIX

如果文件中的最后一行不以换行符结尾,则此行的定义会产生令人惊讶的行为。尽管在文本编辑器和寻呼机中显示这样的行很好,但wc不会将其视为一行。例如:

$ printf 'foo\nbar\n' | wc -l
2
$ printf 'foo\nbar' | wc -l
1
另一方面,Python的readlines()方法旨在提供文件中的数据,以便可以完美地重建它。出于这个原因,它为每行提供最终换行符,并为最后一个非空行提供(有或没有最终换行符)。对于上面的示例,它分别返回列表["foo\n", "bar\n"]["foo\n", "bar"],长度为2:

$ 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

答案 1 :(得分:0)

刚才提到我在做机器翻译任务时遇到了类似的问题。行号不正确的主要原因可能是因为您没有在'b'模式下打开文件。 所以试着

SeekBar sk=(SeekBar) findViewById(R.id.seekBar1);     
    sk.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {       

    @Override       
    public void onStopTrackingTouch(SeekBar seekBar) {      
        // TODO Auto-generated method stub      
    }       

    @Override       
    public void onStartTrackingTouch(SeekBar seekBar) {     
        // TODO Auto-generated method stub      
    }       

    @Override       
    public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {     
        // TODO Auto-generated method stub      

        //Change visibility here based on "progress" value

    }       
});       

您将获得与with open('some file', 'rb') as f: print(len(f.readlines()))

相同的号码

答案 2 :(得分:0)

如果您的文本文件中有 \r,也可能发生这种情况。

<块引用>

从流中读取输入时,如果换行符为None,则通用 换行模式已启用。输入中的行可以以 '\n'、'\r' 或 '\r\n',这些在返回之前被翻译成 '\n' 来电者。

^ 来自 python textiowrapper documentation.