2016-07-29 11 views
0

Ich habe einen Ordner mit etwa 50.000 Textdateien, und ich muss sehen, ob einige von ihnen Zeilen haben, die nur mit dem CR-Zeichen enden/LF oder LF) - hex 0x0D.Verwenden von Python 2.7 - Regex, um alle CR-Zeichen am Ende der Zeilen zu finden

Der folgende Code gibt keine Ergebnisse zurück und benötigt eine LANGE Verarbeitungszeit.

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() 

Vielen Dank im Voraus für jede Einsicht, die jemand zur Verfügung stellen kann. Ich weiß, dass mindestens eine Datei in dem Ordner mit Zeilenumbrüchen nur das Zeichen 0x0D enthält.

+1

Verwenden Sie einfach 'r '\ r (?! \ N)'' aber in vor die gesamte Datei lesen. –

+1

Sie öffnen Dateien im Textmodus, der alle Zeilenendungen in '\ n' konvertiert; wie in der [Dokumentation] (https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files) beim Lesen und Schreiben von Dateien beschrieben. –

Antwort

1

Diese Zeile ist falsch:

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

werden sollten:

for filename in files: 

Wenn alle Dateien in einem Ordner sind, wie Sie sagten, es einfacher ist, os.listdir Sie zu verwenden nicht brauchen die ganze Macht von os.walk, die Ihnen den gesamten Baum unter dem Stammverzeichnis gibt, einschließlich Unterverzeichnissen und Dateien.

Jetzt, da für regex mit den Zeilenumbrüche zu erkennen, das Problem ist, dass, wenn Python die Datei in 'r' Modus öffnet, read oder readline die Zeilenumbrüche all \n ändern.

Die Option wäre die Datei in 'rb' Modus zu öffnen:

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-Systeme haben den file Befehl den Dateityp zu bestimmen. file können Sie den Dateityp auf „magische Zahl“, die Erweiterung erkennen, etc., so dass die Art der Textdatei Bestimmen eines für file

sehr triviale Aufgabe ist, was hat mich watscheln für eine Weile, wenn ich getestet Textdatei, die mit Nano auf einem Mac erstellt wurde. Ich habe \n anstelle der erwarteten \r, bis ich found out, dass MacOS zu \n geändert, um Unix-konform zu sein, die \r zu Legacy-Textdateien verlassen.

Hoffnung hilft das ein wenig. \ N

EOF

+0

Die von mir vorgeschlagene Regex war "r" (?! \ N) "". Keine Notwendigkeit, die Backslashes zu verdoppeln. –

+0

Ja, aber aus irgendeinem Grund, als ich es versuchte, funktionierte es nicht mit einem, ich musste zwei Schrägstriche verwenden. Die Datei, mit der ich es getestet habe, ist eine 520 MB große JSON-Datei, die ich heruntergeladen habe und die zufällige Sequenzen enthält. – chapelo

Verwandte Themen