and*_*wrk 54 python ftp portability
您可以使用ftplib在Python中提供完整的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
Run Code Online (Sandbox Code Playgroud)
产量:
$ 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
...
Run Code Online (Sandbox Code Playgroud)
我想这个想法是解析结果以获得目录列表.但是,此列表直接取决于FTP服务器格式化列表的方式.为此编写代码将不得不预测FTP服务器可能格式化此列表的所有不同方式,这将是非常混乱的.
是否有一种可移植的方式来获取填充目录列表的数组?
(该数组应该只有文件夹名称.)
Wil*_*ler 118
尝试使用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
Run Code Online (Sandbox Code Playgroud)
Gia*_*olà 25
解析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
Run Code Online (Sandbox Code Playgroud)
上面的代码将打印:
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
...
Run Code Online (Sandbox Code Playgroud)
从python 3.3开始,ftplib将提供一个特定的方法来执行此操作:
我在尝试获取文件名、上次修改的图章、文件大小等时找到了我的方法,并想添加我的代码。编写一个循环来解析ftp.dir(dir_list.append)使用 python 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']
Run Code Online (Sandbox Code Playgroud)