Seite 1 von 2

ftp info aus datei einlesen und verzeichnisliste wegschreibe

Verfasst: Freitag 3. September 2004, 10:16
von Alberto
Guten Morgen !

Ich habe bis jetzt noch nicht so viel in Python geschrieben - also seid ein bisschen geduldig :) .

Ich will ein script schreiben das ftp info's aus einer datei ausliest und dann probiert eine verbindung herzustellen um dann ein verzeichnisliste auszuspucken . Ich hab bis jetzt noch kein program gesehen das so etwas kann - erstaunlich eigentlich wenn man bedenkt wie nuetzlich das doch ist . Aber gut ...
Die Verbindung zum ftp ist natuerlich nicht allzu schwierig . was mir schwierigkeiten macht ist das auslesen der informationen aus der datei .
Der Aufbau der Datei ist folgendermassen :

------------------------------
Sitename = name
IP = ip
Password = bla
Port = portnummer
Username = login
------------------------------

Das ganze geht genauso weiter fuer noch mehr ftp's

Was ich bis jetzt geschrieben hab ( funktioniert allerdings nicht ) :

Code: Alles auswählen

def readLine(self):
  try:
    f = open(ftp.txt,'r')
    self.line = pickle.load(f)
    f.close()
    self.reqCount = len(self.requests)

for x in self.line:
    count = count + 1
    if (x[0] == self.chan):
    print x
Wie gesagt ich bin relativ unerfahren in Python - hab bis jetzt mehr bash skripte geschrieben .

Danke schon mal im voraus ,

Albert
Edited by Dookie: ich hab deinen Code in [ python ]...[ /python ] eingeschlossen.

Verfasst: Freitag 3. September 2004, 14:01
von Dookie
Hi Alberto,

wieso verwendest Du pickle, wenn die Datei wie von Dir beschrieben aufgebaut ist?

Code: Alles auswählen

def read_ftp_data(fname):
    """ Lese ftp-Verbindungs-daten aus der Datei 'fname' """
    ftp_daten = []
    f = file(fname,'r')
    for line in f:
        datas = line.split("=")
        if len(datas) == 2: # line hat ein =
            if datas[0].strip() == "Sitename": # neuer Datensatz
                ftp_daten.append([datas[1].strip()])
            else: # letzten Datensatz erweitern
                ftp_daten[-1].append(datas[1].strip())
    close(f)
    return ftp_daten

for x in read_ftp_data("ftp.txt"):
    print x
Gruß

Dookie

Verfasst: Sonntag 5. September 2004, 08:57
von Alberto-zuhaus
Guten Morgen !

Wow das war ja eine schnelle Antwort - hab leider nicht eher antworten koennen! Wochenende - immer stressig :)

So funktioniert das ja schon viel besser !! - Danke !
Jetzt muesste ich nur noch die einzelnen Felder sozusagen einzelnd extrahieren um so dann eine connect mit host und port und ein login mit username und pass zustandezukriegen ....

if datas[0].strip() == "Port":
port=datas[1].strip()

Bin ich damit auf dem richtigen Weg ?

Schoenen Sonntag noch !

Albert

Verfasst: Sonntag 5. September 2004, 11:56
von Dookie
Hi,

Meine Funktion erstellt eine Liste, mit Listen für jeden Eintrag in der Datei in der von Deinem Beispiel vorgegebenen Reihenfolge der Daten. Also Wenn du die Funktion so aufrufst:
ftp_daten = read_ftp_data("ftp.txt")
dann enthält ftp_daten[0] eine Liste mit den ersten Daten aus der Datei und ftp_daten[1] die nächsten und so weiter. Der Port steht in ftp_daten[x][3] das x steht für die Nummer des Datensatzes, die 3 ist die Position von Port (Zählung beginnt bei 0 (=Sitename)!).
Man kann die Funktion auch einfach ändern um eine Liste von Dictionaries zu bekommen:

Code: Alles auswählen

def read_ftp_dicts(fname):
    """ Lese ftp-Verbindungs-daten aus der Datei 'fname' """
    ftp_daten = []
    f = file(fname,'r')
    for line in f:
        datas = line.split("=")
        if len(datas) == 2: # line hat ein =
            key = datas[0].strip().title()
            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

ftp_liste = read_ftp_dicts("ftp.txt")
for x in ftp_liste:
    print x

daten0 = ftp_liste[0]
print "Port vom ersten Eintrag = " + daten0["Port"]
Dann kannst Du auf die Einträge in den Datensätzen über die Schlüsselnamen zugreifen. Der Username im dritten Eintrag wäre dann userame = ftp_liste[2]["Username"]


Gruß

Dookie

Verfasst: Montag 6. September 2004, 08:00
von Alberto-arbeit
Morgen !

Sorry das ich gestern nicht mehr antworten konnte - meine internet war platt .

Ich hab die neue Version gleich ausprobiert - allerdings spuckt Python da eine Fehlermeldung aus :
Traceback (most recent call last):
File "ftp2.py", line 17, in ?
ftp_liste = read_ftp_dicts("ftp.txt")
File "ftp2.py", line 13, in read_ftp_dicts
ftp_daten[-1][key] = value
IndexError: list index out of range

Ich denke das das mit dem [-1] zu tun hat - nimmt das nicht fuer den ersten eintrag -1 an ? Ich dachte das python sich daran vielleicht verschluckt .

Albert

Verfasst: Montag 6. September 2004, 12:49
von Dookie
Mahlzeit,

stimmt vielleicht die Rehenfolge der Daten in der Datei nicht mehr?


Gruß

Dookie

Verfasst: Montag 6. September 2004, 13:15
von Gast
Mahlzeit ,

Die Reihenfolge ist immer noch die selbe :

------------------------------
Sitename = bla ( hier koennen auch noch mehr = Zeichen sein )
IP =
Password =
Port =
Username =
------------------------------
Sitename = -=1=- ( so zum Beispiel )
IP =
Password =
Port =
Username =
------------------------------

Koennte es auch die extra = sein ? Daran hab ich eigentlich noch nicht gedacht .

Verfasst: Montag 6. September 2004, 14:00
von Dookie
Jo das könnte es sein, lässt sich aber leicht erschlagen mit

Code: Alles auswählen

        datas = line.split("=", 1)

Dookie

Verfasst: Montag 6. September 2004, 14:44
von Gast

Code: Alles auswählen

def read_ftp_dicts(fname):
    """ Lese ftp-Verbindungs-daten aus der Datei 'fname' """
    ftp_daten = []
    f = file(fname,'r')
    for line in f:
        datas = line.split("=", 1)
        if len(datas) == 2: # line hat ein =
            key = datas[0].strip().title()
            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

ftp_liste = read_ftp_dicts("ftp.txt")
daten0 = ftp_liste[0]
for x in 100:
      daten0 = ftp_liste[x]
      ip = daten0["IP"]
      port = daten0["Port"]
      user = daten0["Username"]
      paswd = daten0["Password"]
      connect(self,ip = ip , port = port)
      login(self,user,paswd)
      ftp.retrlines('LIST')
so hab ich mir das wenigstens gedacht - allerdings hat python da so seine eigene Meinung . :)

F:\Python23>python.exe ftp2.py
Traceback (most recent call last):
File "ftp2.py", line 19, in ?
for x in 100:
TypeError: iteration over non-sequence

Es waren uebrigens die = Zeichen ! Ueber das close hat er auch gemeckert - hab ich also auch auskommentiert .

Verfasst: Montag 6. September 2004, 15:19
von Dookie
statt close(f) sollte es auch f.close() heissen. Das kommt davon wenn man zwischendurch mal mit anderen Sprachen was machen muss.

Wenn du, was ja öfter vorkommt, mit for, wie in anderen Sprachen, einen Zähler hochzählen willst, geht das in Python etwas anders:

Code: Alles auswählen

for x in xrange(100):
    print x
In deinem Fall, wo du ohnehin etwas mit den Einträgen in einer Liste machen willst gehts so:

Code: Alles auswählen

for daten in ftp_liste:
    ip = daten["Ip"]
    port = daten["Port"]
    ...

Gruß

Dookie

Verfasst: Montag 6. September 2004, 15:59
von Gast
Ich hab daraus jetzt das volgende gemacht :


Code: Alles auswählen

ftp_liste = read_ftp_dicts("ftp.txt")
for daten in ftp_liste:
    ip = daten["IP"]
    port = daten["Port"]
    user = daten["Username"]
    paswd = daten["Password"]
    connect(self,ip = ip , port = port)
    login(self,user,paswd)
    ftp.retrlines('LIST')
Allerdings schein ich irgendwo noch einen Fehler eingebaut zu haben - er meckert naemlich darueber :

File "ftp.py", line 18, in ?
ip = daten["IP"]
KeyError: 'IP'

wenn ich IP als Ip schreibe meckert er ueber Username - ich dachte aber das die Strings doch uebereinstimmen muessen ?!

Verfasst: Montag 6. September 2004, 16:26
von mawe
Hi!

Das liegt daran:

Code: Alles auswählen

key = datas[0].strip().title()

Code: Alles auswählen

"IP".title() # ergibt "Ip"
Lass einfach title() weg, dann sollte IP funktionieren.

Gruß, mawe

Verfasst: Montag 6. September 2004, 16:48
von Dookie
danach wird er über connect(self,ip = ip , port = port) meckern.
das sollte heissen ftp.connect(ip=ip, port=port)
und bei login natürlich auch ftp.login(user,paswd)
Zuvor muss natürlich ftp mit ftp = ftplib.FTP() erzeugt werden. Am Besten schon vor der for-Schleife.


Gruß

Dookie

Verfasst: Montag 6. September 2004, 17:10
von Gast
So das war ja wieder ne schnelle Antwort :-)

Hab das ganze natuerlich auch gleich wieder ausprobiert und darueber faellt er nicht mehr !!
Allerdings scheint er die Zeile

Code: Alles auswählen

ftp = ftplib.FTP() 
nicht zu moegen :

File "ftp.py", line 2, in ?
ftp = ftplib.FTP()
NameError: name 'ftplib' is not defined

Dann hab ich probiert davor ein

Code: Alles auswählen

import ftplib
zu setzen dann meckert er aber ueber :
Traceback (most recent call last):
File "ftp.py", line 2, in ?
import ftplib
File "C:\Python23\lib\ftplib.py", line 45, in ?
import socket
File "C:\Python23\lib\socket.py", line 44, in ?
import _socket
ImportError: Module use of python21.dll conflicts with this version of Python.

Verfasst: Montag 6. September 2004, 17:31
von Gast
python21.dll scheint eine dll aus einer aelteren Version von Python zu sein - das nehm ich auf jeden Fall mal an . Aber ich hab nur Python 2.3 installiert

Verfasst: Montag 6. September 2004, 17:55
von Dookie
jo da scheint eine falsche dll dazwischen geraten zu sein bei dir. An der Stelle muss ich mich als Linuxuser leider ausklinken, Es gibt hier aber auch Windowsuser hier.


Dookie

Verfasst: Montag 6. September 2004, 18:04
von Gast
hehe aber das mit dem import ftplib war schon ok ?

Verfasst: Montag 6. September 2004, 18:14
von Dookie
jo da mit dem import ftplib passt 8)

Verfasst: Montag 6. September 2004, 18:25
von Milan
Dookie hat geschrieben:jo da scheint eine falsche dll dazwischen geraten zu sein bei dir. An der Stelle muss ich mich als Linuxuser leider ausklinken, Es gibt hier aber auch Windowsuser hier.


Dookie
Hi. Dann versuch ich mich mal einzuklinken :wink: . De facto findet er eineveraltete Bibliothek. Hast du wenigestens vorher schon einmal Python 2.1 installiert gehabt? Ich glaub zwar nicht, dass dies der Fall ist, aber möglich wäre es ja. In meinen Augen seh ich nur die Holzhammermethode, die bei Windowsproblemen meistens greift: runter von der Platte und nacheinmal drauf :roll: ... Wenn es aber auch nur die eine DLL ist, die spinnt müsste es eigentlich auch reichen, die Dateien auszutauschen. Das wären die "\DLL\_socket.pyd", "\libs\_socket.dll" und zur Sicherheit auch die "\Lib\socket.py". Das ist mal ein echtes Pythonproblem :lol: , kein BUG im Script :wink: .

Verfasst: Montag 6. September 2004, 18:47
von Gast
Also ich hab Python noch nichtvorher installiert - da hast du recht !

Ich werd mal schauen ob es hilft die dateien zu tauschen - hab schon probiert einfach die python21.dll zu verschieben - aber das hat nicht geholfen .

Na ich poste nochmal wenn ich es geschafft habe !