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

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:

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

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:

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

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:

Mahlzeit,

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


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
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 .
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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

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:

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

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])

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:

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

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

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

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

hehe aber das mit dem import ftplib war schon ok ?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

jo da mit dem import ftplib passt 8)
[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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: .
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 !
Antworten