发布的代码不能正常工作,因为计数器正在计算文件中的字符 - 它不会寻找像\r\n和\n\r这样的字符对。下面是一些Python 2.6代码,它使用正则表达式查找每个EOL(行末)标记的4种出现形式:\r\n、\n\r、\r和\n。关键是在查找单个字符的EOL标记之前先查找\r\n和\n\r配对。为了测试目的,它创建了一些随机文本数据;我写这篇文章时还没有注意到你提供的测试文件链接。
''' Find and count various line ending character combinations
From https://dev59.com/3onda4cB1Zd3GeqPEMwb
Written by PM 2Ring 2015.04.17
'''
import random
import re
from itertools import groupby
random.seed(42)
tokens = list(2*'ABCDEFGHIJK ' + '\r\n') + ['\r\n', '\n\r']
datasize = 300
data = ''.join([random.choice(tokens) for _ in range(datasize)])
print repr(data), '\n'
pat = re.compile(r'\r\n|\n\r|\r|\n')
eols = pat.findall(data)
print eols, '\n'
grouped = [(len(list(group)), key) for key, group in groupby(sorted(eols))]
print sorted(grouped, reverse=True)
输出
'FAHGIG\rC AGCAFGDGEKAKHJE\r\nJCC EKID\n\rKD F\rEHBGICGCHFKKFH\r\nGFEIEK\n\rFDH JGAIHF\r\n\rIG \nAHGDHE\n G\n\rCCBDFK BK\n\rC\n\r\rAIHDHFDAA\r\n\rHCF\n\rIFFEJDJCAJA\r\n\r IB\r\r\nCBBJJDBDH\r FDIFI\n\rGACDGJEGGBFG\n\rBGGFD\r\nDBJKFCA BIG\n\rC J\rGFA HG\nA\rDB\n\r \n\r\n EBF BK\n\rHJA \r\n\n\rDIEI\n\rEDIBEC E\r\nCFEGGD\rGEF EC\r\nFIG GIIJCA\n\r\n\rCFH\r\n\r\rKE HF\n\rGAKIG\r\nDDCDHEIFFHB\n C HAJFHID AC\r'
['\r', '\r\n', '\n\r', '\r', '\r\n', '\n\r', '\r\n', '\r', '\n', '\n', '\n\r', '\n\r', '\n\r', '\r', '\r\n', '\r', '\n\r', '\r\n', '\r', '\r', '\r\n', '\r', '\n\r', '\n\r', '\r\n', '\n\r', '\r', '\n', '\r', '\n\r', '\n\r', '\n', '\n\r', '\r\n', '\n\r', '\n\r', '\r\n', '\r', '\r\n', '\n\r', '\n\r', '\r\n', '\r', '\r', '\n\r', '\r\n', '\n', '\r']
[(17, '\n\r'), (14, '\r'), (12, '\r\n'), (5, '\n')]
这里有一个版本,它从一个命名的文件中读取数据,遵循问题中代码的模式。
import re
from itertools import groupby
import sys
if not sys.argv[1:]:
exit('usage: %s <filename>' % sys.argv[0])
with open(sys.argv[1], 'rb') as f:
data = f.read()
print repr(data), '\n'
pat = re.compile(r'\r\n|\n\r|\r|\n')
eols = pat.findall(data)
print eols, '\n'
grouped = [(len(list(group)), key) for key, group in groupby(sorted(eols))]
print sorted(grouped, reverse=True)