使用python 2.7 - regex在行尾找到所有CR字符

时间:2016-07-29 19:06:46

标签: python regex

我有一个包含大约50,000个文本文件的文件夹,我需要看看它们中是否有任何行只以CR字符结尾(不是CR / LF或LF) - 十六进制0x0D​​。

以下代码不会返回任何结果,并且需要很长时间才能处理。

import re
import os

rootDir = 'Z:\Archive\\20160701'
for root, dirs, files in os.walk(rootDir):
    print('--\nroot = ' + rootDir)

    for filename in rootDir:
        file_path = os.path.join(rootDir, filename)
        print('Searching file: %s' % filename)

        with open(file_path, 'r') as f:
            f_content = f.read()
            check = re.search('[\x0D$]', f_content, re.MULTILINE)
            if check:
                print check
                gotit = open('U:\Temp3\\foundit.txt', 'a')
                gotit.write(file_path + '\n')
                gotit.close()

提前感谢任何人都能提供的见解。我知道文件夹中至少有一个文件只有0x0D字符的换行符。

1 个答案:

答案 0 :(得分:1)

这一行错了:

for filename in rootDir:    # rootDir is 'Z:\Archive\\20160701'

应该是:

for filename in files:

如果所有文件都在一个文件夹中,正如您所说,它更容易使用os.listdir您不需要os.walk的所有权力,它可以让您拥有整个树。根目录,包括子目录和文件。

现在,至于使用regex来检测换行符,问题是当Python以'r'模式打开文件时,readreadline会更改换行符全部为\n

选项是以'rb'模式打开文件:

LF = b'\n'
CR = b'\r'
CRLF = b'\r\n'

def sniff(filename):
    with open(filename, 'rb') as f:
        content = f.read()
        if CRLF in content:
            newline = 'CRLF'
        elif LF in content:
            newline = 'LF'
        elif CR in content:
            newline = 'CR'
    return newline

* nix系统使用file命令来确定文件类型。 file可以根据"幻数",扩展名等检测文件类型,以便确定文本文件的类型对file

来说是一项非常简单的任务

什么让我蹒跚一段时间是我在使用nano测试在mac上创建的文本文件的时候。我得到\n而不是预期的\r,直到我found out MacOS更改为\n才能符合Unix标准,将\r留给遗留文本文件。

希望这有点帮助。\ n

EOF