Frage

Sie können ftplib für die vollständige FTP-Unterstützung in Python verwenden. Jedoch ist die bevorzugte Art und Weise eine Verzeichnisliste zu bekommen ist:

# File: ftplib-example-1.py

import ftplib

ftp = ftplib.FTP("www.python.org")
ftp.login("anonymous", "ftplib-example-1")

data = []

ftp.dir(data.append)

ftp.quit()

for line in data:
    print "-", line

Was ergibt:

$ python ftplib-example-1.py
- total 34
- drwxrwxr-x  11 root     4127         512 Sep 14 14:18 .
- drwxrwxr-x  11 root     4127         512 Sep 14 14:18 ..
- drwxrwxr-x   2 root     4127         512 Sep 13 15:18 RCS
- lrwxrwxrwx   1 root     bin           11 Jun 29 14:34 README -> welcome.msg
- drwxr-xr-x   3 root     wheel        512 May 19  1998 bin
- drwxr-sr-x   3 root     1400         512 Jun  9  1997 dev
- drwxrwxr--   2 root     4127         512 Feb  8  1998 dup
- drwxr-xr-x   3 root     wheel        512 May 19  1998 etc
...

Ich denke, die Idee ist es, die Ergebnisse zu analysieren, um die Verzeichnisliste zu bekommen. Jedoch ist in dieser Liste direkt abhängig von der Art und Weise des FTP-Servers von der Liste zu formatieren. Es wäre sehr chaotisch Code für all die verschiedenen Möglichkeiten, FTP-Server, diese Liste zu formatieren könnte zu antizipieren, die zu schreiben.

Gibt es eine tragbare Art und Weise ein Array mit der Verzeichnisliste gefüllt zu bekommen?

(Das Array sollte nur die Ordner-Namen haben.)

War es hilfreich?

Lösung

Versuchen Sie verwenden ftp.nlst(dir) .

Beachten Sie jedoch, dass, wenn der Ordner leer ist, könnte es einen Fehler aus:

files = []

try:
    files = ftp.nlst()
except ftplib.error_perm, resp:
    if str(resp) == "550 No files found":
        print "No files in this directory"
    else:
        raise

for f in files:
    print f

Andere Tipps

Der zuverlässige / standardisiert FTP Verzeichnisliste zu analysieren ist von MLSD Befehl, die mittlerweile von allen bisherigen / anständigen FTP-Servern unterstützt werden sollen.

import ftplib
f = ftplib.FTP()
f.connect("localhost")
f.login()
ls = []
f.retrlines('MLSD', ls.append)
for entry in ls:
    print entry

Der obige Code wird gedruckt:

modify=20110723201710;perm=el;size=4096;type=dir;unique=807g4e5a5; tests
modify=20111206092323;perm=el;size=4096;type=dir;unique=807g1008e0; .xchat2
modify=20111022125631;perm=el;size=4096;type=dir;unique=807g10001a; .gconfd
modify=20110808185618;perm=el;size=4096;type=dir;unique=807g160f9a; .skychart
...

Starten von Python 3.3 wird ftplib eine spezifische Methode zur Verfügung stellen, dies zu tun:

fand ich meinen Weg hier bei dem Versuch, Dateinamen, zuletzt geändert Stempel zu bekommen, Dateigrößen usw. und wollte meinen Code hinzuzufügen. Es dauerte nur wenige Minuten, um eine Schleife zu schreiben, den ftp.dir(dir_list.append) Gebrauch gemacht wird von Python std lib Sachen wie strip() zu analysieren (die Textzeile zu bereinigen) und split() ein Array zu erstellen.

ftp = FTP('sick.domain.bro')
ftp.login()
ftp.cwd('path/to/data')

dir_list = []
ftp.dir(dir_list.append)

# main thing is identifing which char marks start of good stuff
# '-rw-r--r--   1 ppsrt    ppsrt      545498 Jul 23 12:07 FILENAME.FOO
#                               ^  (that is line[29])

for line in dir_list:
   print line[29:].strip().split(' ') # got yerself an array there bud!
   # EX ['545498', 'Jul', '23', '12:07', 'FILENAME.FOO']

Es gibt keinen Standard für das Layout der LIST Antwort. Sie müßten Code schreiben, um die beliebtestenen Layouts zu handhaben. Ich würde mit Linux ls und Windows Server DIR Formate starten. Es gibt eine Menge Abwechslung gibt, though.

Fall zurück in die nlst Methode (das Ergebnis des NLST Befehl zurückkehrt), wenn Sie die längere Liste nicht analysieren kann. Für Bonuspunkte, betrüge: vielleicht die längste Zahl in der Zeile einen bekannten Dateinamen enthält, ist seine Länge.

ich zufällig mit einem FTP-Server (Rackspace Cloud Seiten virtueller Server) geklebt werden, die nicht MLSD zu unterstützen scheint. Doch ich brauche mehrere Felder von Dateiinformationen, wie Größe und Zeitstempel, nicht nur den Dateinamen, also muss ich den DIR-Befehl verwenden. Auf diesem Server sieht die Ausgabe von DIR sehr ähnlich wie die OPs. Im Fall hilft es jemand, hier ist eine kleine Python-Klasse, die eine Reihe von solchen Ausgang analysiert den Dateinamen, Größe und Zeitstempel zu erhalten.

Import Datetime

class FtpDir:
    def parse_dir_line(self, line):
        words = line.split()
        self.filename = words[8]
        self.size = int(words[4])
        t = words[7].split(':')
        ts = words[5] + '-' + words[6] + '-' + datetime.datetime.now().strftime('%Y') + ' ' + t[0] + ':' + t[1]
        self.timestamp = datetime.datetime.strptime(ts, '%b-%d-%Y %H:%M')

Nicht sehr tragbar, ich weiß, aber einfach zu erweitern oder ändern mit verschiedenen FTP-Servern befassen.

Dies ist von Python-Dokumentation

>>> from ftplib import FTP_TLS
>>> ftps = FTP_TLS('ftp.python.org')
>>> ftps.login()           # login anonymously before securing control 
channel
>>> ftps.prot_p()          # switch to secure data connection
>>> ftps.retrlines('LIST') # list directory content securely
total 9
drwxr-xr-x   8 root     wheel        1024 Jan  3  1994 .
drwxr-xr-x   8 root     wheel        1024 Jan  3  1994 ..
drwxr-xr-x   2 root     wheel        1024 Jan  3  1994 bin
drwxr-xr-x   2 root     wheel        1024 Jan  3  1994 etc
d-wxrwxr-x   2 ftp      wheel        1024 Sep  5 13:43 incoming
drwxr-xr-x   2 root     wheel        1024 Nov 17  1993 lib
drwxr-xr-x   6 1094     wheel        1024 Sep 13 19:07 pub
drwxr-xr-x   3 root     wheel        1024 Jan  3  1994 usr
-rw-r--r--   1 root     root          312 Aug  1  1994 welcome.msg

Das half mir mit meinem Code.

Als ich versuchte feltering nur eine Art von Dateien und zeigen sie auf dem Bildschirm durch eine Bedingung hinzufügen, die auf jeder Zeile testet.

Wie diese

elif command == 'ls':
    print("directory of ", ftp.pwd())
    data = []
    ftp.dir(data.append)

    for line in data:
        x = line.split(".")
        formats=["gz", "zip", "rar", "tar", "bz2", "xz"]
        if x[-1] in formats:
            print ("-", line)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top