Probleme mit der Verarbeitung von Strings

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
The Bang 2
User
Beiträge: 14
Registriert: Montag 11. März 2013, 12:30

Guten Tag zusammen,

ich bin relativ neu in der Programmiererei und bastel zur Zeit an einem Projekt rum.

Hintergrund:

Auf einem FTP-Server werden zyklisch Ordner angelegt, die mit der Bezeichnung "BCK" beginnen. Diese lese ich wie im Programm beschrieben aus und möchte sie weiterbearbeiten. Leider komme ich mit der re-funktion überhaupt nicht klar. Möglicherweise könnt ihr mir sagen wo hier der Fehler liegt?

Code: Alles auswählen

# Importiere Libs
from ftplib import FTP
import re
#Variablen fuer Verbindung
host = '192.168.178.23'
user = 'abb'
passw = 'XYZ'
tardir = '/'
searchdef = 'BCK'
# eine neue Instanz von FTP erzeugen
ftp = FTP(host)
#Login auf Server
ftp.login(user, passw)
#Wechsle zu Verzeichnis /
ftp.cwd(tardir)
#Packe alle Ordner bzw Dateien aus tardir in einen String
units = ftp.nlst()
#Ausgabe auf Bildschirm
print(units)
#Durchsuche String nach definiertem Muster
units = re.findall(searchdef, units)
ftp.quit()
Der Test bricht mir hier immer ab mit der Fehlermeldung: Message File Name Line Position

Code: Alles auswählen

Traceback				
    <module>	C:\Users\Desktop\temperatur\module1.py	20		
    findall	C:\Python33\lib\re.py	201		
TypeError: expected string or buffer				

Zur Info: Der Befehl "units = ftp.nlst()" bringt folgendes Ergebnis:

Code: Alles auswählen

['BCK0307_0529', 'ctrl.bin', 'BCK0307_0525', 'BCK0307_0528', 'BCK0307_0606', 'temp', 'BCK0307_0609', 'BCK0307_0602', 'BCK0307_0527', 'BCK0306_0524', 'BCK0307_0605', 'BCK0307_0531', 'BCK0307_0613', 'BCK0307_0604', 'BCK0307_0526', 'test', 'BCK0307_0610', 'BCK0307_0607', 'BCK0307_0601', 'BCK0307_0608', 'BCK0307_0612', 'BCK0307_0611', '66-26612N', 'BCK0307_0603', 'BCK0307_0530', 'system.dir', 'mc.cfg', 'ctrlused', '3HAC6811-2.20']
Liegt hier einfach der String in einem falschen Format vor?
Zuletzt geändert von Anonymous am Montag 11. März 2013, 13:08, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

units ist eine Liste von Strings, re.findall() erwartet aber nur einen einzelnen String.

Wenn du alle Strings aus der Liste haben willst, die mit 'BCK' anfangen, brauichst du dafür keine regulären Ausdrücke:

Code: Alles auswählen

units = [s for s in units if s.startswith('BCK')]
http://www.florian-diesch.de
BlackJack

@The Bang 2: Dein Quelltext könnte weniger Kommentare und bessere Namen vertragen. Wenn man den Werten passende und ordentlich lesbare Namen gibt, kann man sich viele Kommentare sparen, weil die dann nur noch einmal das offensichtliche wiederholen. Abkürzungen sollte man bei Namen zu Beispiel vermeiden wenn sie nicht allgemein geläufig sind. `tardir`? Steht `tar` nun für das Archivdateiformat TAR oder für `target`? Falls `target`, könnte `dir` auch eine Abkürzung für `direction` sein. `password` könnte man auch ausschreiben.
The Bang 2
User
Beiträge: 14
Registriert: Montag 11. März 2013, 12:30

Vielen Dank euch, werde das so umsetzen und die Ratschläge beherzigen :)
Antworten