ftp info aus datei einlesen und verzeichnisliste wegschreibe

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Alberto
User
Beiträge: 1
Registriert: Freitag 3. September 2004, 09:58

Freitag 3. September 2004, 10:16

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.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Freitag 3. September 2004, 14:01

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
[code]#!/usr/bin/env python
import this[/code]
Alberto-zuhaus

Sonntag 5. September 2004, 08:57

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 5. September 2004, 11:56

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
[code]#!/usr/bin/env python
import this[/code]
Alberto-arbeit

Montag 6. September 2004, 08:00

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 6. September 2004, 12:49

Mahlzeit,

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


Gruß

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

Montag 6. September 2004, 13:15

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 .
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 6. September 2004, 14:00

Jo das könnte es sein, lässt sich aber leicht erschlagen mit

Code: Alles auswählen

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

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

Montag 6. September 2004, 14:44

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 .
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 6. September 2004, 15:19

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
[code]#!/usr/bin/env python
import this[/code]
Gast

Montag 6. September 2004, 15:59

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 ?!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Montag 6. September 2004, 16:26

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 6. September 2004, 16:48

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
[code]#!/usr/bin/env python
import this[/code]
Gast

Montag 6. September 2004, 17:10

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.
Gast

Montag 6. September 2004, 17:31

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
Antworten