zahlen aus textdatei als integer einlesen

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
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Montag 31. Juli 2006, 23:24

Hallo,

Gibt es eine Möglichkeit das Datum und die Zahlen aus einer Textdatei mit diesem Format

Code: Alles auswählen

01.01.2001,1,2,3,4,5
01.02.2001,6,7,8,9,10
01.03.2001,11,12,13,14,15
als Datum bzw. als Integer in ein Array einzulesen?

Oder eine brauchbare Alternative?

Schanke Döhn
BlackJack

Dienstag 1. August 2006, 07:48

Einen Datums-Datentyp findest Du im `datetime` Modul, Dateien in dem Format lassen sich mit dem `csv` Modul einlesen. Zeichenketten kann man mit `int()` in eine Zahl umwandeln. Für das Datum brauchts ein bischen mehr, das muss man an den Punkten aufteilen, die Teile in Zahlen umwandeln und dann an die `date()` Funktion übergeben. Beispiel:

Code: Alles auswählen

import datetime

def str2date(string):
    day, month, year = map(int, string.split('.'))
    return datetime.date(year, month, day)
Ach und was Du als Array bezeichnest ist in Python eine Liste. Arrays gibt's auch, aber damit meint man meistens entweder das `array` Modul oder die Arrays aus dem `numpy` Paket oder dessen Vorgängern.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Dienstag 1. August 2006, 07:50

Ich möchte noch anmerken, dass man zum Einlesen von Datumswerten auch time.strptime verwenden kann.
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Mittwoch 2. August 2006, 07:33

Guten Morgen,

ich habs so wie ich es wollte

Code: Alles auswählen

import csv
reader = csv.reader(open("zahlen.txt", "r"))
list=[]
for row in reader:
    list.append(row)
print list
Was ich mit Array gemeint habe, ist eigentliche eine verschachtelte Liste.
Zuletzt geändert von m3t3or am Samstag 5. August 2006, 13:10, insgesamt 1-mal geändert.
BlackJack

Mittwoch 2. August 2006, 07:52

m3t3or hat geschrieben:ich habs so wie ich es wollte

Code: Alles auswählen

import csv
reader = csv.reader(open("zahlen.txt", "r"))
list=[]
for row in reader:
    list.append(row)
print list
Man sollte besser keine Namen von eingebauten Funktionen "missbrauchen". Hier bindest Du die `list()` Funktion an eine Liste. Und gerade in diesem Fall kann man sie benutzen um die Schleife los zu werden:

Code: Alles auswählen

rows = list(reader)
Und Du kannst die Datei nicht ordnungsgemäss wieder schliessen wenn Du das `open()` so benutzt.
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Mittwoch 2. August 2006, 08:44

@BlackJack:
Meinst du das so?

Code: Alles auswählen

import csv
reader = csv.reader(file("zahlen.txt"))
#liste=[]
rows = list(reader)
#for zeile in rows:
#    liste.append(zeile)
#print liste
print rows
Ist die Datei nach dem durchlauf des Scriptes noch geöffnet? Wenn ja, wie schließe ich die?

ps.
Vielleicht bemerkt man es ja an den Fragen, die ich stelle, ich fange gerade mit Python an
Zuletzt geändert von m3t3or am Samstag 5. August 2006, 13:10, insgesamt 1-mal geändert.
BlackJack

Mittwoch 2. August 2006, 09:20

Ja so meinte ich das.

Wenn das Programm zuende ist, dann sorgt das Betriebssystem dafür, dass alle geöffneten Dateien geschlossen werden. Wenn das Programm also nur kurz läuft, dann muss man sich nicht extra um Dateien kümmern, aber IMHO sollte man sich das gar nicht erst angewöhnen und gleich sauber programmieren.
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Freitag 4. August 2006, 12:21

Nach längerer Rumprobiererei komme ich einfach nicht drauf:
1.) Ist die Textdatei noch geöffnet, oder wird sie, nach dem Zugriff auf rows wieder geschlossen? Sollte die Datei geöffnet sein, wie schließe ich sie wieder?

2.) Der Inhalt der Liste sind Strings. Gibt es ne Möglichkeit, die Strings gleich beim einlesen in das richtige Datenformat(Datum, Integer) zu bringen? Oder ist es sinnvoll, die Liste mit einer Schleife zu verarbeiten, welche die einzelnen Listenelemente im richtigen Datenformat in eine neue Liste schreibt?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 4. August 2006, 12:27

Zu 1: Du brauchst das "file object", also "f = file(...)". Dann kannst du mit "f.close()" die Datei schließen.

Zu 2: Ja, so macht man das normalerweise. Man kann die Schleife dann mit List Comprehensions abkürzen. Z.B.

Code: Alles auswählen

new = []
for line in reader:
    new.append(whatever)
wird zu

Code: Alles auswählen

new = [whatever for line in reader]
BlackJack

Freitag 4. August 2006, 12:33

m3t3or hat geschrieben:1.) Ist die Textdatei noch geöffnet, oder wird sie, nach dem Zugriff auf rows wieder geschlossen? Sollte die Datei geöffnet sein, wie schließe ich sie wieder?
Das macht man mit der `close()` Methode des Datei-Objekts.
2.) Der Inhalt der Liste sind Strings. Gibt es ne Möglichkeit, die Strings gleich beim einlesen in das richtige Datenformat(Datum, Integer) zu bringen? Oder ist es sinnvoll, die Liste mit einer Schleife zu verarbeiten, welche die einzelnen Listenelemente im richtigen Datenformat in eine neue Liste schreibt?
Man kann z.B. eine Funktion schreiben die eine einzelne Zeile wie sie eingelesen wird, also als Liste mit Zeichenketten, in eine Liste mit einem Datum und ganzen Zahlen umwandelt. Die Funktion braucht man dann nur noch auf die Elemente des `reader` Objekts anwenden.

Code: Alles auswählen

import csv
import datetime


def convert_row(row):
    day, month, year = map(int, row[0].split('.'))
    result = [datetime.date(year, month, day)]
    result.extend(map(int, row[1:]))
    return result

csv_file = open('test.csv', 'rb')
reader = csv.reader(csv_file)
data = map(convert_row, reader)
csv_file.close()

print data
m3t3or
User
Beiträge: 18
Registriert: Donnerstag 16. Februar 2006, 11:21

Freitag 4. August 2006, 12:56

@BlackJack:
So hatte ich mir das vorgestellt, danke.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Sonntag 13. August 2006, 06:36

Moin!
m3t3or hat geschrieben:Nach längerer Rumprobiererei komme ich einfach nicht drauf:
1.) Ist die Textdatei noch geöffnet, oder wird sie, nach dem Zugriff auf rows wieder geschlossen? Sollte die Datei geöffnet sein, wie schließe ich sie wieder?
Um Deine Frage endlich mal zu beantworten: ja, die Datei ist am Ende dieses Codeabschnitts noch geöffnet. Und sie bleibt es so lange, bis das interne file-Objekt zerstört (dann beim Aufräumen), oder die Datei eben explizit geschlossen wird.
Das file-Objekt wird zerstört, sobald keine Referenzen mehr darauf verweisen, in Deinem Fall also das csv-Objekt. Das geschieht spätestens am Ende des Programmlaufs, kann aber im Fall der Verwendung in Methoden und Funktionen bereits an derem Ende (aufgrund des lokalen Namensraumes) durch das Aufräumen geschehen - oder Du zerstörst das csv-Objekt als letzte Referenz.

Aber direkt schließen ist zweifellos am saubersten und Du bekommst keine File-Handler-Lecks (offene Dateien, an die Du nicht mehr direkt rankommst).

Ich hoffe, das hilft Dir weiter.

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten