Seite 1 von 1

Hilfe

Verfasst: Freitag 30. März 2012, 23:26
von HarryHrsch
Hallo,
ich bin gerade mein erstes Python Programm zu schreiben.
Ich will aus einer CSV-Datei die letzte Zeile auslesen und davon nochmal zwei Spalten.

Mit diesem Code lese ich die zwei Spalten aus:

Code: Alles auswählen

file=open("file.csv")
content=file.read()
file.close()
dataset=content.split("\n")
for data in dataset:
        col=data.split(",")
        if len(col)==4:
                lon=col[1]
                lat=col[2]
                last= "%02s,%02s" %(lon, lat)
                print last
Aber wie bekomme ich nur die letzte Zeile?
Hatte mir schon überlegt die Zeilen zu Zählen und dann mit readline(x). Nur leider ohne Erfolg. Hier noch mein Code:

Code: Alles auswählen

file=open("file.csv")
line=file.read()
count=0
for newline in line:
        if newline== "\n":       
                count = count +1
content=file.readline("%i" % count)
file.close()
dataset=content.split("\n")
for data in dataset:
        col=data.split(",")
        if len(col)==4:
                lon=col[1]
                lat=col[2]
                last= "%02s,%02s" %(lon, lat)
                print last
Kann mir bitte jemand eine kleine Hilfestellung geben?

Dank

Re: Hilfe

Verfasst: Samstag 31. März 2012, 05:26
von pillmuncher
Bitte Dateien mittels "with" öffnen, dann werden sie automatisch wieder geschlossen. Bitte nicht "file" als Bezeichner verwenden, damit überschreibst du ein Builtin. Bitte die Standard Lib verwenden, dazu ist sie da. Einfach mal dies hier lesen.

Wie ich es machen würde:

Code: Alles auswählen

import csv

with open('csv_file.csv') as csv_file:
    for line in csv_file:
        pass
_, lon, lat, _ = next(csv.reader([line], skipinitialspace=True))
print "%02s,%02s" % (lon, lat)
Was das alles bedeutet steht in der o.g. stdlib Doku und hier. Nur soviel: es gibt keine Fehlerbehandlung, da ich davon ausgehe, dass die CSV-Datei in Ordnung ist. Außerdem gehe ich davon aus, dass ein CSV-Dialekt verwendet wurde, bei dem kein Datensatz sich über mehr als eine Zeile erstrecken kann.

Re: Hilfe

Verfasst: Samstag 31. März 2012, 09:05
von sma
Da `dataset` eine Liste mit allen Zeilen aus `file.csv` ist, ist `dataset[-1]` die letzte Zeile davon. Wenn nicht sicher ist, dass diese auch 4 Werte enthält, muss man aufwendiger suchen. Wenn's immer gilt, reicht

Code: Alles auswählen

_, lon, lat, _ = dataset[-1].split(",")
Stefan

Re: Hilfe

Verfasst: Samstag 31. März 2012, 12:58
von pillmuncher
@sma: Was, wenn die letzte Zeile so aussieht?

Code: Alles auswählen

"lat, lon:", ...

Re: Hilfe

Verfasst: Samstag 31. März 2012, 14:09
von sma
Unwahrscheinlich, denn der ursprüngliche Poster hat's ja auch mit einfachem split() versucht/geschafft.

Es ging bei der Frage doch darum, wie die letzte Zeile gefunden werden kann, und da ist die Antwort "[-1]". Natürlich könnte man diskutieren, dass es ineffizient ist, erst eine ganze Datei in einen String einzulesen, dann eine Liste mit ganz vielen Strings zu erzeugen (die den RAM-Bedarf noch einmal mehr als verdoppeln) aber wozu die ganze Mühe, solange Rechner heutzutage 8 GB RAM und mehr haben und die typische Dateien da längst nicht rankommen...

Stefan

Re: Hilfe

Verfasst: Samstag 31. März 2012, 14:24
von pillmuncher
@sma: Zur Effizienz: da gebe ich dir Recht.

Zur Korrektheit der CSV-Datei: Der OP hat zwar Code gepostet, aber wir wissen nicht, ob der zusammen mit seier CSV-Datei wirklich funktioniert hat. Und selbst wenn. Ein Komma innerhalb eines Strings in einer Komma-getrennten Datei ist völlig rechtens. Und es ist ja nicht so, dass es tagelange Arbeit nach sich ziehen würde, wenn man das csv-Modul hier verwendet. Auch den Programmieraufwand muss man nicht maximal minimieren.

Gruß,
Mick.

Re: Hilfe

Verfasst: Samstag 31. März 2012, 16:34
von HarryHrsch
So vielen dank für die Antworten. Die CSV-Datei hat immer 4 Spalten. Mein erster Code hat funktioniert um die richtigen Spalten zu lesen. Nur bin ich nicht auf die letzte Zeile gekommen. Werde aber heute Abend mal eure Vorschläge testen.

Gruß

EDIT: Also Programm läuft nun. Danke nochmals.

Eine Frage hätte ich noch: Gibt es eine Möglichkeit aus einem Ordner alle CSV-Dateien auszulesen? Bekomme nämlich täglich eine neue Datei, mit neuem Namen aber gleicher Struktur.

Re: Hilfe

Verfasst: Samstag 31. März 2012, 18:00
von BlackJack
@HarryHrsch: Es ging nicht um die Anzahl der Spalten sondern um mögliche Spalteninhalte. Folgende CSV-Zeile hat auch vier Spalten, lässt sich mit einem `split()` aber nicht so einfach verarbeiten:

Code: Alles auswählen

"lat, lon:",42,23,spam

Code: Alles auswählen

In [321]: line = '"lat, lon:",42,23,spam'

In [322]: line.split(',')
Out[322]: ['"lat', ' lon:"', '42', '23', 'spam']

In [323]: import csv

In [324]: csv.reader([line], delimiter=',').next()
Out[324]: ['lat, lon:', '42', '23', 'spam']

Re: Hilfe

Verfasst: Samstag 31. März 2012, 18:51
von HarryHrsch
HarryHrsch hat geschrieben:So vielen dank für die Antworten. Die CSV-Datei hat immer 4 Spalten. Mein erster Code hat funktioniert um die richtigen Spalten zu lesen. Nur bin ich nicht auf die letzte Zeile gekommen. Werde aber heute Abend mal eure Vorschläge testen.

Gruß

EDIT: Also Programm läuft nun. Danke nochmals.

Eine Frage hätte ich noch: Gibt es eine Möglichkeit aus einem Ordner alle CSV-Dateien auszulesen? Bekomme nämlich täglich eine neue Datei, mit neuem Namen aber gleicher Struktur.
Nein meine Spalten sind alle mit einem , getrennt und sind einfache float Werte.

EDIT: Problem mit den unterschiedlich CSV-Dateien gelöst.

Danke

Re: Hilfe

Verfasst: Samstag 31. März 2012, 20:07
von HarryHrsch
Hat sich erledigt. Programm ist fertig.

Danke für die Hilfe