發表的代碼無法正常工作bcause計數器正在計算文件中的字符 - 它不尋找像\r\n
和\n\r
這樣的字符對。
下面是一些Python 2.6代碼,它使用正則表達式找到4個EOL標記\r\n
,\n\r
,\r
和\n
的每個出現位置。訣竅是在查找單個字符EOL標記之前查找\r\n
和\n\r
對。
出於測試目的,它創建一些隨機文本數據;我在注意到您的測試文件鏈接之前就寫了這個。
#!/usr/bin/env python
''' Find and count various line ending character combinations
From http://stackoverflow.com/q/29695861/4014959
Written by PM 2Ring 2015.04.17
'''
import random
import re
from itertools import groupby
random.seed(42)
#Make a random text string containing various EOL combinations
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'
#regex to find various EOL combinations
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'
#regex to find various EOL combinations
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)
和sorrat一樣,我爲該文件獲得1123個crlf對,其他3個EOL標記爲0。 –
@ PM2Ring我需要一個更好的測試文件。我認爲這個實際上包含混合的換行。 –