Analysieren eine plain-text-Datei in eine CSV-Datei mit Python
Ich habe eine Reihe von HTML-Dateien, die analysiert werden, in einem einzigen text-Datei mit Schöne Suppe. Die HTML-Dateien sind so formatiert, dass deren Ausgang ist immer aus drei Zeilen in der text Datei, also die Ausgabe wird ungefähr so Aussehen:
Hello!
How are you?
Well, Bye!
Aber es könnte genauso gut sein,
83957
And I ain't coming back!
hgu39hgd
In anderen Worten, der Inhalt der HTML-Dateien sind nicht wirklich standard für jeden von Ihnen, aber Sie produzieren immer drei Zeilen.
So, ich Frage mich, wo ich anfangen soll, wenn ich wollen, dann nehmen Sie die text-Datei, die erzeugt wird von der Schönen Suppe, und analysieren, dass in einer CSV-Datei mit Spalten wie (im obigen Beispiele):
Title Intro Tagline
Hello! How are you? Well, Bye!
83957 And I ain't coming back! hgu39hgd
Den Python-code für das "stripping" HTML aus text-Dateien, ist dies:
import os
import glob
import codecs
import csv
from bs4 import BeautifulSoup
path = "c:\\users\\me\\downloads\\"
for infile in glob.glob(os.path.join(path, "*.html")):
markup = (infile)
soup = BeautifulSoup(codecs.open(markup, "r", "utf-8").read())
with open("extracted.txt", "a") as myfile:
myfile.write(soup.get_text())
Und ich nehme an, ich kann verwenden Sie diese Option, um die Spalten in der CSV-Datei:
csv.put_HasColumnNames(True)
csv.SetColumnName(0,"title")
csv.SetColumnName(1,"intro")
csv.SetColumnName(2,"tagline")
Wo ich bin Zeichnung leer ist, wie zum Durchlaufen der Textdatei (extracted.txt) eine Zeile zu einem Zeitpunkt und, wie ich an eine neue Linie, stellen Sie es auf die richtige Zelle in der CSV-Datei. Die ersten paar Zeilen der Datei sind leer, und es gibt viele leere Zeilen zwischen jeder Gruppierung von text. Also, als erstes würde ich brauchen, um die Datei zu öffnen und es zu Lesen:
file = open("extracted.txt")
for line in file.xreadlines():
pass # csv.SetCell(0,0 X) (obviously, I don't know what to put in X)
Auch, ich weiß nicht, wie zu sagen, Python, einfach weiter das Lesen der Datei und das hinzufügen, um die CSV-Datei, bis es fertig ist. In anderen Worten, es gibt keine Möglichkeit, genau zu wissen, wie viele Zeilen werden in HTML-Dateien und so kann ich nicht nur csv.SetCell(0,0) to cdv.SetCell(999,999)
.xreadlines
mehr for line in file
Ich bin mir nicht sicher, ob ich verstehe, was du versuchst zu tun. Sind Sie versuchen, Lesen Sie die
extracted.txt
Datei, ignorieren leere Zeilen, und jede Gruppe von drei Zeilen in einer einzigen Zeile in einer CSV-Datei?Ah, fast. Ich bin versucht zu Lesen die erste von drei Linien und legen Sie es auf "Titel" und die zweite der drei Linien und legen Sie es auf "intro" und die Dritte von drei Zeilen, und legen Sie es auf "tagline", und überspringen Sie dann den weißen Raum, bis ich an den nächsten drei Zeilen, und dann tun Sie es wieder.
Auch, es gibt Leerzeichen zwischen dem ersten "Titel" und oben in der Datei.
Ich denke ich muss an fileIN = open(sys.argv[1], "r") und Zeile = fileIN.readline(). Aber ich kann nicht herausfinden, wie das überspringen der Leerzeichen, oder was zu tun mit dem text, sobald ich es bekommen?
InformationsquelleAutor Zac Brown | 2013-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht ganz sicher, was die CSV-Bibliothek, die Sie verwenden, aber es sieht nicht wie Python ' s built-in eine. Wie auch immer, hier ist, wie ich es tun würde:
Diese Art von macht, die eine pipeline. Es ruft zuerst die Daten aus der Datei, dann entfernt alle whitespace-Zeichen am Zeilen, dann entfernt alle leeren Zeilen, dann gruppiert diese in Gruppen von drei, und dann (nach dem schreiben der CSV-header) schreibt, diese Gruppen in der CSV-Datei.
Kombinieren die letzten beiden Spalten wie du schon erwähnt hast in den Kommentaren, Sie könnte sich ändern, die
writerow
Anruf in der offensichtlichen Weise, und diewriterows
:Es hatte einen Fehler: es hat nicht Streifen die Zeilenumbrüche ausschalten, bevor Gruppierung. Dennoch, ich denke, ich kann das schreiben mit generator Verstehens wieder.
Ich habe noch nie gehört, itertools, danke für den Hinweis mir auch so. Wenn ich diesen starte, bekomme ich die Fehlermeldung: Datei "csvify.py", line5, in <module> Zeilen = itertools.ifilter(bool, itertools.imap(str.strip, in_file)) AttributeError: 'module' - Objekt das Attribut 'ifilter'
Das ist irgendwie merkwürdig.
itertools.ifilter
hat keinNeu in version X" - Sache, also, dass würde mich glauben machen, dass es existiert, wennitertools
wurde eingeführt in version 2.3, aber offensichtlich ist es erfolgreich importiert, so dass ich nicht wirklich weiß, was dort passiert. Sowieso, möchten Sie vielleicht versuchen, meine bearbeitete version, die verwendet generator Verstehens für das Teil statt, obwohl es immer noch verwendetitertools.izip
.Sicher, das ist ziemlich einfach. Siehe mein edit.
InformationsquelleAutor icktoofay
Vielleicht hatte ich nicht verstehe Sie richtig, aber Sie tun können:
Was meinst du mit ziemlich nahe? Hast du es versuchen? Ich habe gerade versucht es zu halten, so ähnlich wie das, was du versucht hast (mit
csv.SetCell
, etc). Durch die Art und Weise, die ich von Ihnen positiv bewertet werden, seine Antwort 😉InformationsquelleAutor Oscar Mederos