Hilfe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HarryHrsch
User
Beiträge: 4
Registriert: Freitag 30. März 2012, 22:45

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
Zuletzt geändert von Anonymous am Samstag 31. März 2012, 00:42, insgesamt 1-mal geändert.
Grund: Syntax-Hervorhebung aktiviert
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@sma: Was, wenn die letzte Zeile so aussieht?

Code: Alles auswählen

"lat, lon:", ...
In specifications, Murphy's Law supersedes Ohm's.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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.
In specifications, Murphy's Law supersedes Ohm's.
HarryHrsch
User
Beiträge: 4
Registriert: Freitag 30. März 2012, 22:45

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.
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']
HarryHrsch
User
Beiträge: 4
Registriert: Freitag 30. März 2012, 22:45

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
HarryHrsch
User
Beiträge: 4
Registriert: Freitag 30. März 2012, 22:45

Hat sich erledigt. Programm ist fertig.

Danke für die Hilfe
Antworten