2016-04-12 3 views
-1

Mit Python muss ich eine Datei lesen und feststellen, ob alle Zeilen gleich lang sind oder nicht. Wenn dies der Fall ist, verschiebe ich die Datei in einen "guten" Ordner und wenn sie nicht alle die gleiche Länge haben, verschiebe ich sie in einen "schlechten" Ordner und schreibe ein Word-Dokument, das sagt, welche Zeile nicht die gleiche ist. Irgendwelche Hilfe oder Möglichkeiten zu starten?Datei lesen und feststellen, ob alle Zeilen die gleiche Länge haben

+0

Könnten Sie bitte einen Code-Schnipsel bereitstellen? Hinweis: Um diese Aufgabe zu erledigen, werden mehrere "for" - und do-while-Schleifen benötigt. Außerdem wird der Status jeder Zeile und jeder Seite gespeichert. Plus VBS für das Word-Dokument, das als Vorlage erstellt wird, die jedes Mal aufgerufen wird, wenn sie zur Ausgabe benötigt wird. Viel Arbeit hier. – Sparky256

Antwort

-1

First off, können Sie die Datei, hier example.txt lesen und alle Zeilen in einer Liste setzen, content:

with open(filename) as f: 
    content = f.readlines() 

Als nächstes müssen Sie alle Zeilenumbrüche aus dem Ende einer Zeile trimmen und sie setzen in einer anderen Liste result:

for line in content: 
    line = line.strip() 
    result.append(line) 

Nun ist es nicht so schwer, die Länge jedes Satzes zu erhalten, und da Sie Linien wollen, die schlecht sind, Sie Schleife durch die Liste:

for line in result: 
    lengths.append(len(line)) 

So hat das i-te Element von result Länge [i-th Element von lengths]. Wir können einen Zähler für die Leitungslänge erstellen, die in der Liste am häufigsten vorkommt, es ist so einfach wie eine Zeile!

most_occuring = max(set(lengths), key=lengths.count) 

Jetzt können wir ein anderes for-loop zu überprüfen, welche machen Längen mit den meisten vorkommenden entsprechen nicht und fügen Sie diejenigen bad-lines:

for i in range(len(lengths)): 
    if (lengths[i] != most_occuring): 
     bad_lines.append([i, result[i]]) 

Der nächste Schritt ist zu prüfen, wo die Datei gehen muss , die guten Ordner oder die schlechten Ordner:

if len(bad_lines == 0): 
    #Good file, move it to the good folder, use the os or shutil module 
    os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 
else: 
    #Bad file, one or more lines are bad, thus move it to the bad folder 
    os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 

der letzte Schritt, die schlechten Linien auf einem andere Datei schreibt, die tun kann, da haben wir die schlechten Linien bereits in einer Liste bad_lines:

with open("bad_lines.txt", "wb") as f: 
    for bad_line in bad_lines: 
     f.write("[%3i] %s\n" % (bad_line[0], bad_line[1])) 

Es ist nicht eine doc-Datei, aber ich denke, das ist ein schöner Start ist. Sie können sich das docx-Modul ansehen, wenn Sie wirklich in eine doc-Datei schreiben möchten.

EDIT: Hier ist ein Beispiel Python-Skript.

Kurzschlüsse, stoppt er die Datei in dem ersten nicht-Spiel zu lesen
with open(filename) as read_file: 
    length = len(read_file.readline()) 
    if all(len(line) == length for line in read_file): 
     # Move to good folder 
    else: 
     # Move to bad folder 

Seit all() sind.

with open("example.txt") as f: 
    content = f.readlines() 

result = [] 
lengths = [] 

#Strip the file of \n 
for line in content: 
    line = line.strip() 
    result.append(line) 
    lengths.append(len(line)) 

most_occuring = max(set(lengths), key=lengths.count) 
bad_lines = [] 

for i in range(len(lengths)): 
    if (lengths[i] != most_occuring): 
     #Append the bad_line to bad_lines 
     bad_lines.append([i, result[i]]) 

#Check if it's a good, or a bad file 
#if len(bad_lines == 0): 
    #Good File 
    #Move file to the good folder... 
#else: 
    #Bad File 

with open("bad_lines.txt", "wb") as f: 
    for bad_line in bad_lines: 
     f.write("[%3i] %s\n" % (bad_line[0], bad_line[1])) 
+0

'line = line.strip()' trimmt ein bisschen mehr als nur das Zeilenumbruchzeichen am Ende einer Zeile. – Evert

+0

Es ist nicht nötig, die Zeilenumbrüche zu entfernen. Sie sollten die gleiche Länge haben. – zondo

+0

Sie haben recht damit ein bisschen mehr zu strippen, aber es macht die Arbeit erledigt. Sie könnten es zwar auch entfernen, aber es sieht in der Liste ordentlicher aus. Wenn Sie es auslassen, sollten Sie auch das \ n im Write-File-Teil entfernen. Ist das der Grund dafür, dass dies abgelehnt wurde? Dies ist meine erste Antwort, also würde ich gerne wissen, was ich verbessern kann. Ich kann nicht auf Ihre Antwort Zondo kommentieren, aber er fragt auch nach den Linien, die anders sind, so dass Sie alle durchlaufen müssen. Beachten Sie, dass in meiner Antwort auch Teile in einer Schleife für bessere Zeiteffizienz zusammengestellt werden können (nicht viel, es wird immer noch O (n) sein) –

0

Sie all() verwenden sollten

+0

Ich versuche, uns diese Methode, und ich bekomme immer diese Fehler Länge = len (file.readline()) AttributeError: 'str' Objekt hat kein Attribut 'readline' –

+0

@JustinStarkman: Sorry, ich hatte einen leichten Tippfehler. Es ist jetzt behoben. – zondo

Verwandte Themen