检查FTP服务器上的对象是使用Python和ftplib的文件或目录
使用Python和ftplib,我正在编写一个通用函数来检查FTP目录中的项目是文件还是目录。 由于使用MLSD函数可能不一定适用于所有的服务器(我的一个用例不提供),我已经采取了这种有效但粗糙的方式来确定它,试图改变目录到对象,如果对象是一个文件,引发一个exception,并相应地设置文件types。
file_type = '' try: ftp.cwd(item_name) file_type = 'dir' ftp.cwd(cur_path) except ftplib.error_perm: file_type = 'file'
我已经search了其他方法的互联网和图书馆文件,但我找不到在大多数情况下工作的。
例如,使用dir
函数,我可以检查第一个字符是否是'd'
,这可能会确定它,但是进一步阅读已经指出并不是所有的输出格式都是相同的。
我在这个方法中看到的最大的缺陷是如果我没有权限将目录改变到指定的文件夹; 因此将被视为一个文件。
有什么我失踪或更干净的方式来做到这一点?
没有更好的方法(通常与FTP协议,而不仅仅是ftplib)。
MLST
/ MLSD
是唯一正确和可靠的方法。
如果你不能使用MLST
/ MLSD
,那么尝试CWD
是下一个最好的select。
试图parsingLIST
是一个后备选项。 但是你需要知道服务器使用你的程序能够理解的列表格式。
以下是我通过FTP版本的os.walk
为FTP服务器使用的function。 这里是github链接,如果你想看到完整的代码https://github.com/Kasramvd/FTPwalk :
def listdir(self, connection, _path): file_list, dirs, nondirs = [], [], [] try: connection.cwd(_path) except: return [], [] connection.retrlines('LIST', lambda x: file_list.append(x.split())) for info in file_list: ls_type, name = info[0], info[-1] if ls_type.startswith('d'): dirs.append(name) else: nondirs.append(name) return dirs, nondirs
说明:
在这里,你需要的只是循环你想要的目录中的文件和目录,并select目录。 但是由于你不能像你在OS中使用的那样做,你需要使用ftplib.FTP.retrlines()
函数来检索ASCII传输模式下的文件或目录列表,然后你可以通过parsing这些行来分离目录。