ftp info aus datei einlesen und verzeichnisliste wegschreibe

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Gast

Ok - hab das ganze nochmals auf eine andere Partition installiert - diesemsla scheint es gutgegangen zu sein - allerdings kommt jetzt wieder ein Script error ! :(

Traceback (most recent call last):
File "ftp.py", line 34, in ?
ftp.connect(host=ip, port=port)
File "D:\Python23\lib\ftplib.py", line 117, in connect
for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
socket.gaierror: (9, 'getaddrinfo failed')
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

lass dir mal mit print ip, port vor der zeile mit dem ftp.connect..., die IP und den Port ausgeben. vielleicht hast Du eine falsche IP oder einen falschen Port in der liste.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Guten Morgen !

Ich denk der fehler liegt darin das ip und port nicht gedefiniert sind ...

Code: Alles auswählen

for daten in ftp_liste:
    ip = "IP".title()
    port = "Port".title()
    user = "User".title()
    paswd = "Password".title()
    print ip, port
    ftp.connect(host=ip, port=port)
    ftp.login(user=user,passwd=paswd)
    ftp.retrlines('LIST')
    ftp.quit()
F:\Python23>python.exe ftp.py
Ip Port
Traceback (most recent call last):
File "ftp.py", line 28, in ?
ftp.connect(host=ip, port=port)
File "F:\Python23\lib\ftplib.py", line 117, in connect
for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM):
socket.gaierror: (9, 'getaddrinfo failed')

Ich denk ich hab doch irgendwas falsch gemacht ...
Gast

Ahhh hab den Fehler selbst schon gefunden - schein da was falsch begriffen zu haben . Jetzt funzt es auch !
Ein Problem ist allerdings noch da - wenn es einen timout gibt - dann bricht python ab . Das muss ich noch irgendwie abfangen ...
Gast

Es scheint eine Funktion zu geben die "ftp.all_errors" heisst allerdings bin ich mir nicht sicher ob sie hierfuer geignet ist und wie ich sie anwenden soll ?
Gast

Ok hier meine Loesung :

Code: Alles auswählen

for daten in ftp_liste:
    ip = daten["IP"]
    port = daten["Port"]
    user = daten["Username"]
    paswd = daten["Password"]
    print ip, port
    try:
        ftp.connect(host=ip, port=port)
        ftp.login(user=user,passwd=paswd)
        ftp.retrlines('LIST')
        ftp.quit()
    except ftplib.all_errors:
        print "Connection error"
Funktioniert auch prima !

Danke euch allen fuer die Hilfe !!
Gast

Na dann komt jetzt doch noch ne Frage :-)
Wie kann ich fehler mit dem in und auslesen abfangen ? Im Moment stopert er noch ueber ein paar Dinge - es waere einfacher wenn es einfach eine Fehlermeldung ausspucken wuerde und dann "weiter im Text" ?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

erstmal würde ich die Leseroutine robuster machen. Zumindest kann Gross/Kleinschreibung ignoriert werden. Dann kann auch überprüft werden, ob die Schlüssel erlaubt sind.

Code: Alles auswählen

allowed_keys = ["sitename", "ip", "port", "username", "password"]

def read_ftp_dicts(fname):
    """ Lese ftp-Verbindungs-daten aus der Datei 'fname' """
    ftp_daten = []
    f = file(fname,'r')
    znr = -1
    for line in f:
        znr += 1
        datas = line.split("=", 1)
        if len(datas) == 2: # line hat ein =
            key = datas[0].strip().lower() # achtung alle Schluessel klein
            if not key in allowed_keys:
                print "Unbekannter Schluessel '%s' in Zeile %i in Datei %s" % (key, znr, fname)
            else:
                value = datas[1].strip()
                if key == "sitename": # neuer Datensatz
                    ftp_daten.append({key : value})
                else: # letzten Datensatz erweitern
                    ftp_daten[-1][key] = value
    close(f)
    return ftp_daten 
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Hi !

Ja so scheint es wirklich stabiler zu sein - er stolpert immer noch ueber ein paar Datensaetze - die zum Beispiel nur 3 eintraege haben ( anonymus ) und andere an denen ich nicht sehen kann was das Problem ist . Aber das kommt nicht haeufig vor !
Darum hab ich das Program ein paar Freunden gezeigt - die fanden es auch eine gute Idee hatten aber auch noch ein paar Ideen .
Sie fanden das das Programm zu lang braucht ( ich hab keinen Timeout gesetzt ) und das ergebnis sollte besser in eine Datei geschrieben werden . Das mit der Datei - da dachte ich einfach daran es so laufen zu lassen :
ftpcheck.exe > liste.txt

Ich hab inzwischen aus dem Script eine exe gemacht ( einfacher fuer uns Windows user :-) )

Mit dem timeout bin ich noch nicht so ganz viel weiter - hab auch hier im Forum geschaut und das folgende gesehen :

ftp.sock.settimeout(30)

Allerdings funktioniert das bei mir nicht . Hab auch hier : http://pydoc.org/2.3/ftplib.html geschaut - konnte allerdings da auch nichts finden .
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi auch,

bevor du da jetzt weiter machst, hab ich mal ne Frage zu der Datei mit den Informationen für die FTP-Verbindungen. Ist das Dateiformat vorgegeben oder von dir selber "ausgedacht"?
Wenn das flexibel ist, würde sich dafür eine XML-Datei anbieten. Dann könnten optionale Felder (für anonymus, z.b.) leer bleiben und es wär besser ersichtlich, welche Einträge für welche Verbindung gelten.

Code: Alles auswählen

<?xml version="1.0"?>
<FTP_Liste>
  <Connection>
    <Sitename>name</Sitename>
    <IP>127.0.0.1</IP>
    <Port>27</Port>
    <User>bla</User>
    <Password>blabla</Password>
  </Connection>
  <Connection>
    <Sitename>Suse</Sitename>
    <IP>ftp.suse.org</IP>
    <Port>27</Port>
    <User></User>
    <Password></Password>
  </Connection>
</FTP_Liste>
Die downloads könntest Du auch über Threads realisieren. Dazu gibts hier schon einen Thread.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Leider ist das Format nicht selber ausgedacht . Es gibt ein program das heisst defxp - damit kann man von einem Program das Flashfxp heisst die sites.dat entschluesseln .
Und das programm spuckt die datei so aus . Leider .

In dem thread hab ich auch die Sache mit dem Timeout gefunden - hat aber leider nicht gefunktioniert . Allerdings scheint sie mir auch nicht so geeignet - da in dem Fall die Verbindung schon bestehtr - bei mir das Problem aber eher beim Verbindungsaufbau zustande kommt .
Gast

Anonymous hat geschrieben:Leider ist das Format nicht selber ausgedacht . Es gibt ein program das heisst defxp - damit kann man von einem Program das Flashfxp heisst die sites.dat entschluesseln .
Und das programm spuckt die datei so aus . Leider .

In dem thread hab ich auch die Sache mit dem Timeout gefunden - hat aber leider nicht gefunktioniert . Allerdings scheint sie mir auch nicht so geeignet - da in dem Fall die Verbindung schon bestehtr - bei mir das Problem aber eher beim Verbindungsaufbau zustande kommt .
:)
Antworten