开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python使用FTP

PythonFTP编程教程展示了如何使用ftplib库在Python中使用FTP。我们将连接到FTP服务器、列出目录、下载和上传文件。

FTP

文件传输协议(FTP)是一种标准网络协议,用于在计算机网络上的客户端和服务器之间传输计算机文件。客户端和服务器通过一组FTP命令进行通信,例如DELE、RETR或CWD。

许多服务器提供匿名FTP访问的FTP服务;例如,有些Linux托管站点提供匿名FTP帐户来下载分发映像。

Python文件库

Pythonftplib是一个实现FTP协议客户端的模块。它包含一个FTP客户端类和一些辅助函数。

PythonFTP类

ftplib.FTP创建FTP类的一个新实例。当给定主机时,将使用connect方法建立到主机的连接。

上下文管理器

与Python3不同,Python2没有使用FTP类实现的上下文管理器。因此,Python2代码在处理连接对象时需要一种稍微不同的方法。

import ftplib

with ftplib.FTP('ftp.debian.org') as ftp:

with命令将自动关闭Python3代码与服务器的连接。

import ftplib
from contextlib import closing

with closing(ftplib.FTP('ftp.debian.com')) as ftp:

对于Python2代码,我们需要使用contextlib模块的closing方法。

欢迎辞

getwelcome返回服务器为回复初始连接而发送的欢迎消息。此消息可能包含一些对用户有用的信息。

#!/usr/bin/python

import ftplib

with ftplib.FTP('ftp.debian.org') as ftp:
    print(ftp.getwelcome())

该示例创建到DebianFTP服务器的连接,该服务器有一个匿名帐户并返回其欢迎消息。

$ ./welcome.py
220 ftp.debian.org FTP server

目录列表

dir方法生成目录列表。

#!/usr/bin/python

import ftplib

with ftplib.FTP('ftp.debian.org') as ftp:

    try:
        ftp.login()

        files = []

        ftp.dir(files.append)

        print(files)

    except ftplib.all_errors as e:
        print('FTP error:', e)

该示例连接到ftp.debian.org主机并检索初始登陆目录的目录列表。

try:
    ftp.login()

login方法没有参数时;我们连接到FTP站点的匿名帐户。

files = []

ftp.dir(files.append)

dir方法生成目录列表并将数据添加到列表中。

$ ./listing.py
['drwxr-xr-x    9 1176     1176         4096 Sep 26 15:07 debian']

FTP命令

FTP客户端向FTP服务器发送命令,如PWDRETR。ftplib包含几个包装这些命令的方法。命令通过sendcmdvoidcmd方法发送。

#!/usr/bin/python

import ftplib

with ftplib.FTP('ftp.debian.org') as ftp:

    try:
        ftp.login()

        wdir = ftp.sendcmd('PWD')
        print(ftplib.parse257(wdir))

        wdir2 = ftp.pwd()
        print(wdir2)

    except ftplib.all_errors as e:
        print('FTP error:', e)

该示例通过直接发送PWD命令并使用pwd方法来检索当前工作目录。

wdir = ftp.sendcmd('PWD')

我们使用sendcmd方法发送PWD命令。

print(ftplib.parse257(wdir))

parse257是一个辅助方法,它从返回的字符串中检索目录,该字符串还包含状态代码。

wdir2 = ftp.pwd()
print(wdir2)

这里我们使用pwd方法获取当前工作目录。

$ ./ftp_commands.py
/
/

改变目录

cwd方法改变当前工作目录。

#!/usr/bin/python

import ftplib

with ftplib.FTP('ftp.debian.org') as ftp:

    try:
        ftp.login()

        wdir = ftp.pwd()
        print(wdir)

        ftp.cwd('debian')

        wdir2 = ftp.pwd()
        print(wdir2)

    except ftplib.all_errors as e:
        print('FTP error:', e)

范例使用cmd方法切换到debian文件夹。

$ ./change_directory.py
/
/debian

创建目录

目录是用mkd方法创建的。此操作需要具有足够权限的用户帐户;它不适用于匿名帐户。

#!/usr/bin/python

import ftplib
from contextlib import closing

with closing(ftplib.FTP('ftp.example.com')) as ftp:

    try:
        ftp.login('user7', 's$cret')

        ftp.mkd('newdir')

        files = []

        ftp.retrlines('LIST', files.append)

        for fl in files:
            print(fl)

    except ftplib.all_errors as e:
        print('FTP error:', e)

该示例连接到FTP服务器并在登录文件夹中创建一个新目录。

ftp.login('user7', 's$cret')

我们使用login方法登录。

ftp.mkd('newdir')

使用mkd方法创建一个新目录。

files = []

ftp.retrlines('LIST', files.append)

使用LISTFTP命令,我们可以检索文件列表和有关这些文件的信息。该列表存储在files列表中。

$ ./create_directory.py
drwx------   6 example.com 117992          7 Sep 27 14:58 .
drwx------   6 example.com 117992          7 Sep 27 14:58 ..
-rw-------   1 example.com 117992        151 Jul 31  2015 .htaccess
drwxr-xr-x   2 0        0            4096 Sep 27 01:16 logs
drwx---r-x   2 example.com 117992          2 Sep 27 14:58 newdir
drwx------   3 example.com 117992          3 Mar 11  2011 sub
drwx------  26 example.com 117992         31 Sep 25 15:32 web

从输出中我们可以看到newdir已创建。

获取文本文件的大小

SIZE命令及其size方法等价于非标准区域确定文件大小的方法。尽管没有标准化,但它已被许多服务器实现。

#!/usr/bin/python

import ftplib

with ftplib.FTP('ftp.debian.org') as ftp:

    try:
        ftp.login()

        size = ftp.size('debian/README')
        print(size)

    except ftplib.all_errors as e:
        print('FTP error:', e)

该示例使用size方法检索README文件的大小。

获取二进制文件的大小

要确定二进制文件的大小,我们必须切换到二进制模式。

#!/usr/bin/python

import ftplib

with ftplib.FTP('ftp.debian.org') as ftp:

    try:
        ftp.login()

        # TYPE A for ASCII mode
        ftp.sendcmd('TYPE I')

        size = ftp.size('debian/ls-lR.gz')
        print(size)

    except ftplib.all_errors as e:
        print('FTP error:', e)

该示例确定二进制文件的大小。

ftp.sendcmd('TYPE I')

我们使用TYPEI命令进入二进制模式。

size = ftp.size('debian/ls-lR.gz')

我们得到一个二进制文件的大小。

下载文本文件

要下载文本文件,我们使用RETRFTP命令。

#!/usr/bin/python

import ftplib
import os

with ftplib.FTP('ftp.debian.org') as ftp:

    file_orig = '/debian/README'
    file_copy = 'README'

    try:
        ftp.login()

        with open(file_copy, 'w') as fp:

            res = ftp.retrlines('RETR ' + file_orig, fp.write)

            if not res.startswith('226 Transfer complete'):

                print('Download failed')
                if os.path.isfile(file_copy):
                    os.remove(file_copy)

    except ftplib.all_errors as e:
        print('FTP error:', e)

        if os.path.isfile(file_copy):
            os.remove(file_copy)

该示例从ftp.debian.org服务器下载一个文本文件。

with open(file_copy, 'w') as fp:

    res = ftp.retrlines('RETR ' + file_orig, fp.write)

我们获取文件并写入本地副本文件。

if not res.startswith('226 Transfer complete'):

    print('Download failed')
    if os.path.isfile(file_copy):
        os.remove(file_copy)

如果下载失败,我们会打印一条错误消息并删除本地文件。

上传文本文件

STOR命令与storlines方法用于上传文本文件。

#!/usr/bin/python

import ftplib

with ftplib.FTP('ftp.example.com') as ftp:

    filename = 'README'

    try:
        ftp.login('user7', 's$cret')

        with open(filename, 'rb') as fp:

            res = ftp.storlines("STOR " + filename, fp)

            if not res.startswith('226 Transfer complete'):

                print('Upload failed')

    except ftplib.all_errors as e:
        print('FTP error:', e)

在这个例子中,我们将一个文本文件上传到FTP服务器。

在本教程中,我们使用了Pythonftplib

阅读Python教程或列出所有Python教程。

未经允许不得转载:我爱分享网 » Python使用FTP

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏