Test Bereich aus einem File Auslesen.

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
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Hallo Ich möchte aus einem file eine 4 stellige zahl auslesen.
Dies kann ich ja mit

Code: Alles auswählen

f = open('/mein/pfad','r')
    text = f.read(79) 
    print (text)
    f.close()
bis zu dem 79 buchstaben auslesen.
Ich möchte aber nur die 4 Stellen vor 79 also 76,77,78 und 79. ist es möglich nur diese 4 zahlen auszulesen?
BlackJack

@Willhelm: Schau Dir mal die `seek()`-Methode an. Wobei es sich hoffentlich nicht tatsächlich um eine Textdatei und eine vierstellige Zahl handelt, das ist dann nämlich nicht besonders robust da auf bestimmte Bytepositionen zuzugreifen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dateien haben neben der read-Methode noch eine seek-Methode, damit kannst du bis zu einer bestimmten Stelle springen. In deinem Fall bis zur Position 76. Anschließend kannst du dann weitere vier Zeichen auslesen.

Dateien solltest du am besten mittels with-Statement öffnen, dann werden diese auch wieder vernünftig geschlossen. Um den close-Aufruf musst du dir dann keine Gedanken mehr machen, auch nicht, wenn eine Exception auftritt. In kenne den Inhalt deiner Datei nicht, aber wahrscheinlich möchtest du sie lieber im Binärmodus "rb" statt "r" öffnen. Im Textmodus werden unter Umständen die Zeilenenden geändert, was in deinem Fall zu Fehlern führen könnte.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dein Ansatz ist falsch. Ob du mit den ersten 79 _Bytes_ deine Zahlen erwischst, haengt vom Encoding der Datei ab.
Mit ASCII stimmt das, mit UTF-8 zb aber nur wenn bis dorthin tatsaechlich nur Zahlen (bzw ASCII kodierbare Zeichen) enthalten sind.
Generell stimmt das Vorgehen da aber nicht.

Vorausgesetzt es klappt also zufaellig, dann kannst du `file.seek` benutzen.

Generell: Benutze die `with`-Anweisung um Dateien zu oeffnen.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Ok vielen Dank für die Schnellen Antworten.
Ich habe es gleich einmal umgesetzt jetzt gibt er mir den fehler aus "Permission Denied"

der code sieht so aus:

Code: Alles auswählen

#!/usr/bin/env python

fo = open('/sys/devices/w1_bus_master1/28-0000051380b0/w1_slave','rw+')
print "w1_slave: ", fo.name
line = fo.readline()
print "Read Line: %s" % (line)
fo.seek(68, 73)
line = fo.readline()
print "Read Line: %s" % (line)
fo.close()
Die Fehler meldung.

Code: Alles auswählen

Traceback (most recent call last):
  File "temperatur_watchdog.py", line 4, in <module>
    fo = open('/sys/devices/w1_bus_master1/28-0000051380b0/w1_slave','rw+')
IOError: [Errno 13] Permission denied: '/sys/devices/w1_bus_master1/28-0000051380b0/w1_slave'
Es handelt sich um einen 1 wire temperatur sensor.
BlackJack

@Willhelm: Wahrscheinlich wirst Du keine Schreibrechte haben. Und noch mal: Wenn das eine Textdatei ist, dann hör auf da Bytes an festen Offsets auslesen zu wollen und verarbeite das auf eine robustere Art. Niemand garantiert Dir das die Ziffern immer an diesen Stellen stehen, das kann sich jederzeit ändern.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Ok Danke für den hinweis ich habe rw+ in r umgewandelt und es funktioniert jetzt.

Für dieses File trift dies nicht zu weil es die ganze zeit wieder überschrieben wird. und Die Temperatur immer an dieser stelle befindet. Aber danke dennoch.
BlackJack

@Willhelm: Doch auf diese Datei trifft zu das nicht garantiert ist, dass die Temperatur immer exakt an dem Offset steht, und auch in Zukunft immer stehen wird. Es sei denn Du hast diese Garantie tatsächlich wörtlich so in der Dokumentation des Gerätetreibers gefunden, was ich stark bezweifle.

Im Gegenteil kann Dein Ansatz schon falsche Ergebnisse liefern wenn es Probleme bei der Übertragung gab und die Prüfsumme falsch ist, also in der ersten Zeile ein NO statt eines YES steht. Dann ist nämlich nicht nur der Temperaturwert undefiniert, sondern Du liest die falschen Positionen aus, weil NO ein Byte kürzer als YES ist. Eine robuste Lösung behandelt diese Datei als Textdatei und überprüft als erstes in der ersten Zeile mindestens mal ob sie mit YES endet, und sucht sich dann in der zweiten Zeile das 't=47110'-Muster um die Temperatur zu ermitteln.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Und mit welchen Befehlen kann ich dies in Python umsetzen?
BlackJack

@Willhelm: Schau Dir einfach mal an was Zeichenketten so an Operationen und Methoden unterstützen. Reguläre Ausdrücke (`re`-Modul) sind bei solchen Aufgaben auch oft nützlich, hier aber wohl nicht nötig.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Hast mir nicht zufälliger weise ein beispiel mit einer with anweisung.?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Willhelm hat geschrieben:Hast mir nicht zufälliger weise ein beispiel mit einer with anweisung.?
Was möchtest du haben? Eine Variante für eine eigene Klasse oder ein Beispiel für das Öffnen einer Datei.

Im zweiten Fall sieht das so aus (ohne with / mit with):

Code: Alles auswählen

f = open(filename)
data = f.read()
f.close()

with open(filename) as f:
  data = f.read()
Wenn du jetzt noch Fehlerbehandlung mit try-except einbaust, dann merkst du so richtig die Vorteile von with.
BlackJack

Wobei die erste Variante ohne ``with`` eigentlich so aussehen müsste um äquivalent zu sein:

Code: Alles auswählen

f = open(filename)
try:
    data = f.read()
finally:
    f.close()
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Ok ich habe es jetzt so gelöst:

Code: Alles auswählen

 
f = open('/sys/devices/w1_bus_master1/28-0000051380b0/w1_slave','r')
 #f = open('temp.txt', 'r')
 m = re.search(r'(t=(.*))', f.read(), re.M|re.I)
 if m:
      reading = int(m.group(2));
 f.close
 print (state, reading);
Für die die es Interessiert.
BlackJack

@Willhelm: Das ist ungünstig wenn das Muster nicht zutrifft weil `reading` dann undefiniert ist und zu einer Ausnahme führt.

Edit: Und es wird nicht berücksichtigt falls die Daten nicht stimmen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und das with-Statement verwendest du auch nicht. In diesem Fall führt es auch gleich dazu, dass die geöffnete Datei nicht geschlossen wird.
Das Leben ist wie ein Tennisball.
Antworten