首页 > 解决方案 > 为什么linux wc -l命令和python open打开的文件行数不一样?

问题描述

对于机器翻译语料库 news-commentary-v12。当我通过命令计算行数时 wc -l ,数字是227330。 在此处输入图像描述

但是我通过python代码打开文件with open(filepath, 'r', encoding='utf-8') as fp fp.readlines(),数字分别是227568和227603。

然后我以二进制模式打开文件with open(filepath, 'rb')as fp。我得到 227330。为什么文件中的行数不同?

语料库链接:http ://data.statmt.org/wmt17/translation-task/training-parallel-nc-v12.tgz

蟒蛇代码。我以二进制模式打开文件rb并对其进行解码,decode('utf-8')我可以得到 227330,但在读取模式下r,只有append我无法得到正确的数字。

en_len = 0
zh_len = 0
en = []
zh = []
with open(en_path, 'rb') as fp:
    for i in fp.readlines():
        # en.append(i)
        en.append(i.decode('utf-8').strip())
        en_len += 1
with open(zh_path, 'rb') as fp:
    for i in fp.readlines():
        # zh.append(i)
        zh.append(i.decode('utf-8').strip())
        zh_len += 1
print('en', en_len)
print('zh', zh_len)

标签: pythonfile

解决方案


Unicode 定义了更多的换行符。

Unicode 标准定义了许多符合标准的应用程序应识别为行终止符的字符:

 LF:    Line Feed, U+000A
 VT:    Vertical Tab, U+000B
 FF:    Form Feed, U+000C
 CR:    Carriage Return, U+000D
 CR+LF: CR (U+000D) followed by LF (U+000A)
 NEL:   Next Line, U+0085
 LS:    Line Separator, U+2028
 PS:    Paragraph Separator, U+2029

wc只计算 LF 字符。

编辑:实际上,pythonreadlines()方法会拆分更多字符,如这个出色的答案所示。还包括:

FS: File Separator U+001C
GS: Group Separator U+001D
RS: Record Separator U+001E

推荐阅读