python - 为什么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)
解决方案
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
推荐阅读
- c++ - 原子头文件c ++
- google-app-engine - Google Cloud Stackdriver Debugging 在特定条件下的 for 循环中调试?
- reactjs - npx create-react-app 获取错误
- sum - Ansible - 我可以循环求和数字吗?
- c# - Microsoft.Office.Interop.Excel 太慢了
- c# - 如何计算 EDF 文件的持续时间(时间)?
- php - 将php对象转换为日期格式
- javascript - 如何使用 javascript 显示自定义字段编号
- angular - 如何将 Angular 5 应用程序添加到 Visual Studio 中的解决方案?
- java - Java:堆栈(从一个堆栈中删除一个元素并通过用户输入哪个堆栈到哪个堆栈添加到另一个堆栈