問題描述
我正在嘗試從 FTP 服務器獲取所有目錄的名稱,并將它們以分層順序存儲在多維列表或字典中
I am trying to to get all directories' name from an FTP server and store them in hierarchical order in a multidimensional list or dict
例如,一個包含以下結構的服務器:
So for example, a server that contains the following structure:
/www/
mysite.com
images
png
jpg
在腳本的末尾,會給我一個列表,例如
at the end of the script, would give me a list such as
['/www/'
['mysite.com'
['images'
['png'],
['jpg']
]
]
]
我嘗試過使用這樣的遞歸函數:def 遍歷(目錄):FTP.dir(目錄,遍歷)
I have tried using a recursive function like so: def traverse(dir): FTP.dir(dir, traverse)
FTP.dir 以這種格式返回行:
FTP.dir returns lines in this format:
drwxr-xr-x 5 leavesc1 leavesc1 4096 Nov 29 20:52 mysite.com
這樣做 line[56:] 只會給我目錄名稱(mysite.com).我在遞歸函數中使用它.
so doing line[56:] will give me just the directory name(mysite.com). I use this in the recursive function.
但我無法讓它工作.我嘗試了許多不同的方法,但無法讓它發揮作用.還有很多 FTP 錯誤(找不到目錄 - 這是一個邏輯問題,有時服務器返回意外錯誤,沒有留下日志,我無法調試)
But i cannot get it to work. I've tried many different approaches and can't get it to work. Lots of FTP errors as well (either can't find the directory - which is a logical issue, and sometimes unexpected errors returned by the server, which leaves no log and i can't debug)
底線問題:如何從 FTP 服務器獲取分層目錄列表?
bottom line question: How to get a hierarchical directory listing from an FTP server?
推薦答案
這是一個幼稚而緩慢的實現.它很慢,因為它嘗試對每個目錄條目進行 CWD 以確定它是目錄還是文件,但這有效.可以通過解析 LIST 命令輸出來優化它,但這很大程度上依賴于服務器實現.
Here is a naive and slow implementation. It is slow because it tries to CWD to each directory entry to determine if it is a directory or a file, but this works. One could optimize it by parsing LIST command output, but this is strongly server-implementation dependent.
import ftplib
def traverse(ftp, depth=0):
"""
return a recursive listing of an ftp server contents (starting
from the current directory)
listing is returned as a recursive dictionary, where each key
contains a contents of the subdirectory or None if it corresponds
to a file.
@param ftp: ftplib.FTP object
"""
if depth > 10:
return ['depth > 10']
level = {}
for entry in (path for path in ftp.nlst() if path not in ('.', '..')):
try:
ftp.cwd(entry)
level[entry] = traverse(ftp, depth+1)
ftp.cwd('..')
except ftplib.error_perm:
level[entry] = None
return level
def main():
ftp = ftplib.FTP("localhost")
ftp.connect()
ftp.login()
ftp.set_pasv(True)
print traverse(ftp)
if __name__ == '__main__':
main()
這篇關于遍歷 FTP 列表的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!