باستخدام بايثون ftplib للحصول على سرد الدليل, portably

StackOverflow https://stackoverflow.com/questions/111954

  •  02-07-2019
  •  | 
  •  

سؤال

يمكنك استخدام ftplib الكامل FTP دعم في بيثون.ولكن الطريقة المفضلة للحصول على سرد الدليل هو:

# 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

والتي ينتج:

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

أعتقد أن الفكرة هي أن تحليل النتائج للحصول على قائمة الدليل.غير أن هذه القائمة هي تعتمد مباشرة على ملقم FTP طريقة التنسيق القائمة.سيكون فوضوي جدا لكتابة الكود هذا بعد أن توقع جميع طرق مختلفة خوادم FTP قد شكل هذه القائمة.

هل هناك المحمولة طريقة للحصول على مجموعة مليئة الدليل قائمة ؟

(مجموعة يجب أن يكون فقط أسماء المجلدات.)

هل كانت مفيدة؟

المحلول

محاولة استخدام ftp.nlst(dir).

لاحظ أن إذا كان المجلد فارغ ، قد رمي خطأ:

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

نصائح أخرى

موثوق بها/موحدة طريقة تحليل FTP سرد الدليل باستخدام MLSD الأمر الذي ينبغي أن تكون معتمدة من قبل كل الأخيرة/لائقة خوادم FTP.

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

رمز أعلاه سوف الطباعة:

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

بدءا من بيثون 3.3, ftplib سوف توفر طريقة محددة للقيام بذلك:

وجدت طريقي إلى هنا بينما كان يحاول الحصول على أسماء آخر تعديل الطوابع أحجام الملفات الخ و أريد أن أضيف قانون بلدي.استغرق الأمر سوى بضع دقائق لكتابة حلقة تحليل ftp.dir(dir_list.append) مما يجعل استخدام بيثون std lib الاشياء مثل strip() (لتنظيف خط النص) ، split() لإنشاء مجموعة.

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

لا يوجد معيار تخطيط LIST استجابة.سيكون لديك لكتابة التعليمات البرمجية للتعامل مع الأكثر شعبية تخطيطات.أود أن تبدأ مع لينكس ls و Windows Server DIR صيغ.هناك الكثير من مجموعة متنوعة من هناك ، على الرغم من.

تقع مرة أخرى إلى nlst طريقة (العودة نتيجة NLST الأمر) إذا كنت لا يمكن تحليل تعد قائمة.للحصول على نقاط المكافأة ، الغش:وربما أطول العدد في السطر الذي يحتوي معروف اسم الملف طوله.

كنت يحدث أن يكون عالقا مع خادم FTP (Rackspace Cloud مواقع الملقم الظاهري) لا يبدو أن الدعم MLSD.حتى الآن أنا بحاجة إلى عدة مجالات ملف المعلومات مثل الحجم والطابع الزمني ، وليس فقط اسم الملف لذا يجب استخدام الأمر DIR.على هذا الملقم إخراج DIR تبدو كثيرا مثل OP.في حال لم يساعد أي شخص هنا قليلا الثعبان الفئة التي يوزع خط من هذا الانتاج للحصول على اسم الملف, الحجم والطابع الزمني.

استيراد التاريخ والوقت

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

لا محمولة جدا, أعرف, ولكن من السهل على تمديد أو تعديل للتعامل مع مختلف خوادم FTP.

هذا من بيثون مستندات

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

التي ساعدتني مع قانون بلدي.

عندما حاولت feltering فقط نوع من ملفات تظهر على الشاشة من خلال إضافة شرط أن الاختبارات على كل خط.

مثل هذا

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top