{"id":1295,"date":"2022-09-06T17:17:23","date_gmt":"2022-09-06T09:17:23","guid":{"rendered":"http:\/\/175.24.184.226\/?p=1295"},"modified":"2022-09-09T16:18:26","modified_gmt":"2022-09-09T08:18:26","slug":"%e3%80%90python%e5%ad%a6%e4%b9%a0-%e3%80%91python%e5%ae%9e%e7%8e%b0%e7%9a%84ftp%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd%e5%8a%9f%e8%83%bd_%e5%ad%97%e8%8a%82%e5%8d%b7%e5%8a%a8%e7%9a%84%e5%8d%9a","status":"publish","type":"post","link":"\/?p=1295","title":{"rendered":"\u3010Python\u5b66\u4e60 \u3011Python\u5b9e\u73b0\u7684FTP\u4e0a\u4f20\u548c\u4e0b\u8f7d\u529f\u80fd_\u5b57\u8282\u5377\u52a8\u7684\u535a\u5ba2"},"content":{"rendered":"<h1><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>\u4e00\u3001\u80cc\u666f<\/h1>\n<p>\u6700\u8fd1\u516c\u53f8\u7684\u4e00\u4e9b\u81ea\u52a8\u5316\u64cd\u4f5c\u9700\u8981\u4f7f\u7528Python\u6765\u5b9e\u73b0FTP\u7684\u4e0a\u4f20\u548c\u4e0b\u8f7d\u529f\u80fd\u3002\u56e0\u6b64\u53c2\u8003\u7f51\u4e0a\u7684\u4f8b\u5b50\uff0c\u64b8\u4e86\u4e00\u6bb5\u4ee3\u7801\u6765\u5b9e\u73b0\u4e86\u8be5\u529f\u80fd\uff0c\u4e0b\u9762\u505a\u4e2a\u8bb0\u5f55\u3002<\/p>\n<h1><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>\u4e8c\u3001ftplib\u4ecb\u7ecd<\/h1>\n<p>Python\u4e2d\u9ed8\u8ba4\u5b89\u88c5\u7684ftplib\u6a21\u5757\u5b9a\u4e49\u4e86FTP\u7c7b\uff0c\u5176\u4e2d\u51fd\u6570\u6709\u9650\uff0c\u53ef\u7528\u6765\u5b9e\u73b0\u7b80\u5355\u7684ftp\u5ba2\u6237\u7aef\uff0c\u7528\u4e8e\u4e0a\u4f20\u6216\u4e0b\u8f7d\u6587\u4ef6\u3002<\/p>\n<ul>\n<li>Python 2.7\u7cfb\u5217\u5b98\u65b9\u6587\u6863\uff1a <a href=\"https:\/\/docs.python.org\/2\/library\/ftplib.html\">https:\/\/docs.python.org\/2\/library\/ftplib.html<\/a><\/li>\n<li>Python 3.5\u7cfb\u5217\u5b98\u65b9\u6587\u6863\uff1a<a href=\"https:\/\/docs.python.org\/3.5\/library\/ftplib.html\">https:\/\/docs.python.org\/3.5\/library\/ftplib.html<\/a><\/li>\n<li>Python 3.6\u7cfb\u5217\u5b98\u65b9\u6587\u6863\uff1a<a href=\"https:\/\/docs.python.org\/3.6\/library\/ftplib.html\">https:\/\/docs.python.org\/3.6\/library\/ftplib.html<\/a><\/li>\n<\/ul>\n<p>ftplib\u4e2d\u7684FTP \u4e3b\u8981\u6709\u4ee5\u4e0b\u8fd9\u4e9b\u65b9\u6cd5<br \/>\n<img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/bab6ac3d37f88e79fd5c2066ab22e2d5.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/6331749281aa043f0fbaecbc80bddc05.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u8fd9\u4e9b\u65b9\u6cd5\uff0c\u53ef\u4ee5\u53c2\u8003\u6e90\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u8d34\u7684\u5b98\u65b9\u6587\u6863\u6765\u8fdb\u884c\u5b66\u4e60\u3002<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/6799fafc4c4859d6f8d739bd3e35d76c.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/3c3f7903e92feb270d6056edb1f74929.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/7867509c5bca518420a193ec83953e93.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u6211\u4eec\u4e3b\u8981\u9700\u8981\u4f7f\u7528\u5230\u7684api\u6709\u4ee5\u4e0b\u51e0\u4e2a\uff1a<\/p>\n<ul>\n<li>1\u3001\u8fde\u63a5\u670d\u52a1\u5668\uff1a<\/li>\n<\/ul>\n<pre><code>ftp=FTP()                   #\u8bbe\u7f6e\u53d8\u91cf\n\nftp.connect(&quot;IP&quot;,&quot;port&quot;)    #\u8fde\u63a5\u7684ftp sever\u548c\u7aef\u53e3\n\nftp.login(&quot;user&quot;,&quot;password&quot;)#\u8fde\u63a5\u7684\u7528\u6237\u540d\uff0c\u5bc6\u7801\u5982\u679c\u533f\u540d\u767b\u5f55\u5219\u7528\u7a7a\u4e32\u4ee3\u66ff\u5373\u53ef \n<\/code><\/pre>\n<ul>\n<li>2\u3001\u4e0a\u4f20\u6587\u4ef6\uff1a<\/li>\n<\/ul>\n<pre><code>fp=open(&#039;E:\/test.xlsx&#039;,&#039;rb&#039;)      \n\ncmd=&#039;STOR filepath\/test.xlsx&#039;\n\nftp.storbinary(cmd, fp)     \n<\/code><\/pre>\n<p><code>storbinary<\/code>\u662f\u4ee5\u4e8c\u8fdb\u5236\u5f62\u5f0f\u4e0a\u4f20\u6587\u4ef6\u3002<br \/>\n<code>cmd<\/code>: <code>STOR<\/code>\u547d\u4ee4\uff0c\u662fFTP\u7684\u4e00\u4e2a\u547d\u4ee4\uff0c\u540e\u9762\u9700\u8981\u52a0\u4e0a\u4fdd\u5b58\u6587\u4ef6\u7684\u8def\u5f84\u53ca\u6587\u4ef6\u540d<br \/>\n<code>fp<\/code>: \u4e00\u4e2a\u6253\u5f00\u7684\u6587\u4ef6\u5bf9\u8c61\uff0c<code>\u2018rb\u2019<\/code>,\u4ee5\u4e8c\u8fdb\u5236\u5f62\u5f0f\u6253\u5f00\u6587\u4ef6<\/p>\n<ul>\n<li>3\u3001\u4e0b\u8f7d\u6587\u4ef6\uff1a<\/li>\n<\/ul>\n<pre><code>ftp.nlst(path) #\u83b7\u53d6\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\n\nfile_handle=open(filename,&quot;wb&quot;).write     #\u4ee5\u5199\u6a21\u5f0f\u5728\u672c\u5730\u6253\u5f00\u6587\u4ef6\n\nftp.retrbinary(&quot;RETR filename.txt&quot;,file_handle)   #\u63a5\u6536\u670d\u52a1\u5668\u4e0a\u6587\u4ef6\u5e76\u5199\u5165\u672c\u5730\u6587\u4ef6\n<\/code><\/pre>\n<ul>\n<li>4\u3001\u5176\u4ed6\u65b9\u6cd5\uff1a<\/li>\n<\/ul>\n<pre><code>ftp.set_debuglevel(2)       #\u6253\u5f00\u8c03\u8bd5\u7ea7\u522b2\uff0c\u663e\u793a\u8be6\u7ec6\u4fe1\u606f\n\nftp.set_pasv(0)           #0\u4e3b\u52a8\u6a21\u5f0f 1 #\u88ab\u52a8\u6a21\u5f0f\n\nprint ftp.getwelcome()      #\u6253\u5370\u51fa\u6b22\u8fce\u4fe1\u606f\n\nftp.cmd(&quot;xxx\/xxx&quot;)         #\u66f4\u6539\u8fdc\u7a0b\u76ee\u5f55\n\nftp.set_debuglevel(0)       #\u5173\u95ed\u8c03\u8bd5\u6a21\u5f0f\n\nftp.quit()              #\u9000\u51faftp\n\nftp.dir()               #\u663e\u793a\u76ee\u5f55\u4e0b\u6587\u4ef6\u4fe1\u606f\n\nftp.mkd(pathname)          #\u65b0\u5efa\u8fdc\u7a0b\u76ee\u5f55\n\nftp.pwd()               #\u8fd4\u56de\u5f53\u524d\u6240\u5728\u4f4d\u7f6e\n\nftp.rmd(dirname)          #\u5220\u9664\u8fdc\u7a0b\u76ee\u5f55\n\nftp.delete(filename)        #\u5220\u9664\u8fdc\u7a0b\u6587\u4ef6\n\nftp.rename(fromname, toname)   #\u5c06fromname\u4fee\u6539\u540d\u79f0\u4e3atoname\u3002\n<\/code><\/pre>\n<h1><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>\u4e09\u3001\u4f7f\u7528ftplib\u6765\u5b9e\u73b0FTP\u4e0a\u4f20\u4e0b\u8f7d\u529f\u80fd<\/h1>\n<p>\u53c2\u8003\u5b98\u7f51\u4ee5\u53ca\u4e92\u8054\u7f51\u5176\u4ed6\u8d44\u6e90\uff0c\u64b8\u4e86\u4e0b\u9762\u8fd9\u4efd\u4ee3\u7801\uff0c\u4f5c\u4e3a\u4e00\u4e2aFTP\u5de5\u5177\u7c7b<\/p>\n<pre><code>#!\/usr\/bin\/python\n# -*- coding: UTF-8 -*-\n\nfrom ftplib import FTP\nimport os\nimport sys\nimport time\nimport socket\n\nclass MyFTP:\n    &quot;&quot;&quot;\n        ftp\u81ea\u52a8\u4e0b\u8f7d\u3001\u81ea\u52a8\u4e0a\u4f20\u811a\u672c\uff0c\u53ef\u4ee5\u9012\u5f52\u76ee\u5f55\u64cd\u4f5c\n        \u4f5c\u8005\uff1a\u6b27\u9633\u9e4f\n        \u535a\u5ba2\u5730\u5740\uff1ahttp:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\n    &quot;&quot;&quot;\n\n    def __init__(self, host, port=21):\n        &quot;&quot;&quot; \u521d\u59cb\u5316 FTP \u5ba2\u6237\u7aef\n        \u53c2\u6570:\n                 host:ip\u5730\u5740\n\n                 port:\u7aef\u53e3\u53f7\n        &quot;&quot;&quot;\n        # print(&quot;__init__()---&gt; host = %s ,port = %s&quot; % (host, port))\n\n        self.host = host\n        self.port = port\n        self.ftp = FTP()\n        # \u91cd\u65b0\u8bbe\u7f6e\u4e0b\u7f16\u7801\u65b9\u5f0f\n        self.ftp.encoding = &#039;gbk&#039;\n        self.log_file = open(&quot;log.txt&quot;, &quot;a&quot;)\n        self.file_list = []\n\n    def login(self, username, password):\n        &quot;&quot;&quot; \u521d\u59cb\u5316 FTP \u5ba2\u6237\u7aef\n            \u53c2\u6570:\n                  username: \u7528\u6237\u540d\n\n                 password: \u5bc6\u7801\n            &quot;&quot;&quot;\n        try:\n            timeout = 60\n            socket.setdefaulttimeout(timeout)\n            # 0\u4e3b\u52a8\u6a21\u5f0f 1 #\u88ab\u52a8\u6a21\u5f0f\n            self.ftp.set_pasv(True)\n            # \u6253\u5f00\u8c03\u8bd5\u7ea7\u522b2\uff0c\u663e\u793a\u8be6\u7ec6\u4fe1\u606f\n            # self.ftp.set_debuglevel(2)\n\n            self.debug_print(&#039;\u5f00\u59cb\u5c1d\u8bd5\u8fde\u63a5\u5230 %s&#039; % self.host)\n            self.ftp.connect(self.host, self.port)\n            self.debug_print(&#039;\u6210\u529f\u8fde\u63a5\u5230 %s&#039; % self.host)\n\n            self.debug_print(&#039;\u5f00\u59cb\u5c1d\u8bd5\u767b\u5f55\u5230 %s&#039; % self.host)\n            self.ftp.login(username, password)\n            self.debug_print(&#039;\u6210\u529f\u767b\u5f55\u5230 %s&#039; % self.host)\n\n            self.debug_print(self.ftp.welcome)\n        except Exception as err:\n            self.deal_error(&quot;FTP \u8fde\u63a5\u6216\u767b\u5f55\u5931\u8d25 \uff0c\u9519\u8bef\u63cf\u8ff0\u4e3a\uff1a%s&quot; % err)\n            pass\n\n    def is_same_size(self, local_file, remote_file):\n        &quot;&quot;&quot;\u5224\u65ad\u8fdc\u7a0b\u6587\u4ef6\u548c\u672c\u5730\u6587\u4ef6\u5927\u5c0f\u662f\u5426\u4e00\u81f4\n\n           \u53c2\u6570:\n             local_file: \u672c\u5730\u6587\u4ef6\n\n             remote_file: \u8fdc\u7a0b\u6587\u4ef6\n        &quot;&quot;&quot;\n        try:\n            remote_file_size = self.ftp.size(remote_file)\n        except Exception as err:\n            # self.debug_print(&quot;is_same_size() \u9519\u8bef\u63cf\u8ff0\u4e3a\uff1a%s&quot; % err)\n            remote_file_size = -1\n\n        try:\n            local_file_size = os.path.getsize(local_file)\n        except Exception as err:\n            # self.debug_print(&quot;is_same_size() \u9519\u8bef\u63cf\u8ff0\u4e3a\uff1a%s&quot; % err)\n            local_file_size = -1\n\n        self.debug_print(&#039;local_file_size:%d  , remote_file_size:%d&#039; % (local_file_size, remote_file_size))\n        if remote_file_size == local_file_size:\n            return 1\n        else:\n            return 0\n\n    def download_file(self, local_file, remote_file):\n        &quot;&quot;&quot;\u4eceftp\u4e0b\u8f7d\u6587\u4ef6\n            \u53c2\u6570:\n                local_file: \u672c\u5730\u6587\u4ef6\n\n                remote_file: \u8fdc\u7a0b\u6587\u4ef6\n        &quot;&quot;&quot;\n        self.debug_print(&quot;download_file()---&gt; local_path = %s ,remote_path = %s&quot; % (local_file, remote_file))\n\n        if self.is_same_size(local_file, remote_file):\n            self.debug_print(&#039;%s \u6587\u4ef6\u5927\u5c0f\u76f8\u540c\uff0c\u65e0\u9700\u4e0b\u8f7d&#039; % local_file)\n            return\n        else:\n            try:\n                self.debug_print(&#039;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;\u4e0b\u8f7d\u6587\u4ef6 %s ... ...&#039; % local_file)\n                buf_size = 1024\n                file_handler = open(local_file, &#039;wb&#039;)\n                self.ftp.retrbinary(&#039;RETR %s&#039; % remote_file, file_handler.write, buf_size)\n                file_handler.close()\n            except Exception as err:\n                self.debug_print(&#039;\u4e0b\u8f7d\u6587\u4ef6\u51fa\u9519\uff0c\u51fa\u73b0\u5f02\u5e38\uff1a%s &#039; % err)\n                return\n\n    def download_file_tree(self, local_path, remote_path):\n        &quot;&quot;&quot;\u4ece\u8fdc\u7a0b\u76ee\u5f55\u4e0b\u8f7d\u591a\u4e2a\u6587\u4ef6\u5230\u672c\u5730\u76ee\u5f55\n                       \u53c2\u6570:\n                         local_path: \u672c\u5730\u8def\u5f84\n\n                         remote_path: \u8fdc\u7a0b\u8def\u5f84\n                &quot;&quot;&quot;\n        print(&quot;download_file_tree()---&gt;  local_path = %s ,remote_path = %s&quot; % (local_path, remote_path))\n        try:\n            self.ftp.cwd(remote_path)\n        except Exception as err:\n            self.debug_print(&#039;\u8fdc\u7a0b\u76ee\u5f55%s\u4e0d\u5b58\u5728\uff0c\u7ee7\u7eed...&#039; % remote_path + &quot; ,\u5177\u4f53\u9519\u8bef\u63cf\u8ff0\u4e3a\uff1a%s&quot; % err)\n            return\n\n        if not os.path.isdir(local_path):\n            self.debug_print(&#039;\u672c\u5730\u76ee\u5f55%s\u4e0d\u5b58\u5728\uff0c\u5148\u521b\u5efa\u672c\u5730\u76ee\u5f55&#039; % local_path)\n            os.makedirs(local_path)\n\n        self.debug_print(&#039;\u5207\u6362\u81f3\u76ee\u5f55: %s&#039; % self.ftp.pwd())\n\n        self.file_list = []\n        # \u65b9\u6cd5\u56de\u8c03\n        self.ftp.dir(self.get_file_list)\n\n        remote_names = self.file_list\n        self.debug_print(&#039;\u8fdc\u7a0b\u76ee\u5f55 \u5217\u8868: %s&#039; % remote_names)\n        for item in remote_names:\n            file_type = item[0]\n            file_name = item[1]\n            local = os.path.join(local_path, file_name)\n            if file_type == &#039;d&#039;:\n                print(&quot;download_file_tree()---&gt; \u4e0b\u8f7d\u76ee\u5f55\uff1a %s&quot; % file_name)\n                self.download_file_tree(local, file_name)\n            elif file_type == &#039;-&#039;:\n                print(&quot;download_file()---&gt; \u4e0b\u8f7d\u6587\u4ef6\uff1a %s&quot; % file_name)\n                self.download_file(local, file_name)\n            self.ftp.cwd(&quot;..&quot;)\n            self.debug_print(&#039;\u8fd4\u56de\u4e0a\u5c42\u76ee\u5f55 %s&#039; % self.ftp.pwd())\n        return True\n\n    def upload_file(self, local_file, remote_file):\n        &quot;&quot;&quot;\u4ece\u672c\u5730\u4e0a\u4f20\u6587\u4ef6\u5230ftp\n\n           \u53c2\u6570:\n             local_path: \u672c\u5730\u6587\u4ef6\n\n             remote_path: \u8fdc\u7a0b\u6587\u4ef6\n        &quot;&quot;&quot;\n        if not os.path.isfile(local_file):\n            self.debug_print(&#039;%s \u4e0d\u5b58\u5728&#039; % local_file)\n            return\n\n        if self.is_same_size(local_file, remote_file):\n            self.debug_print(&#039;\u8df3\u8fc7\u76f8\u7b49\u7684\u6587\u4ef6: %s&#039; % local_file)\n            return\n\n        buf_size = 1024\n        file_handler = open(local_file, &#039;rb&#039;)\n        self.ftp.storbinary(&#039;STOR %s&#039; % remote_file, file_handler, buf_size)\n        file_handler.close()\n        self.debug_print(&#039;\u4e0a\u4f20: %s&#039; % local_file + &quot;\u6210\u529f!&quot;)\n\n    def upload_file_tree(self, local_path, remote_path):\n        &quot;&quot;&quot;\u4ece\u672c\u5730\u4e0a\u4f20\u76ee\u5f55\u4e0b\u591a\u4e2a\u6587\u4ef6\u5230ftp\n           \u53c2\u6570:\n\n             local_path: \u672c\u5730\u8def\u5f84\n\n             remote_path: \u8fdc\u7a0b\u8def\u5f84\n        &quot;&quot;&quot;\n        if not os.path.isdir(local_path):\n            self.debug_print(&#039;\u672c\u5730\u76ee\u5f55 %s \u4e0d\u5b58\u5728&#039; % local_path)\n            return\n\n        self.ftp.cwd(remote_path)\n        self.debug_print(&#039;\u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: %s&#039; % self.ftp.pwd())\n\n        local_name_list = os.listdir(local_path)\n        for local_name in local_name_list:\n            src = os.path.join(local_path, local_name)\n            if os.path.isdir(src):\n                try:\n                    self.ftp.mkd(local_name)\n                except Exception as err:\n                    self.debug_print(&quot;\u76ee\u5f55\u5df2\u5b58\u5728 %s ,\u5177\u4f53\u9519\u8bef\u63cf\u8ff0\u4e3a\uff1a%s&quot; % (local_name, err))\n                self.debug_print(&quot;upload_file_tree()---&gt; \u4e0a\u4f20\u76ee\u5f55\uff1a %s&quot; % local_name)\n                self.upload_file_tree(src, local_name)\n            else:\n                self.debug_print(&quot;upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a %s&quot; % local_name)\n                self.upload_file(src, local_name)\n        self.ftp.cwd(&quot;..&quot;)\n\n    def close(self):\n        &quot;&quot;&quot; \u9000\u51faftp\n        &quot;&quot;&quot;\n        self.debug_print(&quot;close()---&gt; FTP\u9000\u51fa&quot;)\n        self.ftp.quit()\n        self.log_file.close()\n\n    def debug_print(self, s):\n        &quot;&quot;&quot; \u6253\u5370\u65e5\u5fd7\n        &quot;&quot;&quot;\n        self.write_log(s)\n\n    def deal_error(self, e):\n        &quot;&quot;&quot; \u5904\u7406\u9519\u8bef\u5f02\u5e38\n            \u53c2\u6570\uff1a\n                e\uff1a\u5f02\u5e38\n        &quot;&quot;&quot;\n        log_str = &#039;\u53d1\u751f\u9519\u8bef: %s&#039; % e\n        self.write_log(log_str)\n        sys.exit()\n\n    def write_log(self, log_str):\n        &quot;&quot;&quot; \u8bb0\u5f55\u65e5\u5fd7\n            \u53c2\u6570\uff1a\n                log_str\uff1a\u65e5\u5fd7\n        &quot;&quot;&quot;\n        time_now = time.localtime()\n        date_now = time.strftime(&#039;%Y-%m-%d&#039;, time_now)\n        format_log_str = &quot;%s ---&gt; %s \\n &quot; % (date_now, log_str)\n        print(format_log_str)\n        self.log_file.write(format_log_str)\n\n    def get_file_list(self, line):\n        &quot;&quot;&quot; \u83b7\u53d6\u6587\u4ef6\u5217\u8868\n            \u53c2\u6570\uff1a\n                line\uff1a\n        &quot;&quot;&quot;\n        file_arr = self.get_file_name(line)\n        # \u53bb\u9664  . \u548c  ..\n        if file_arr[1] not in [&#039;.&#039;, &#039;..&#039;]:\n            self.file_list.append(file_arr)\n\n    def get_file_name(self, line):\n        &quot;&quot;&quot; \u83b7\u53d6\u6587\u4ef6\u540d\n            \u53c2\u6570\uff1a\n                line\uff1a\n        &quot;&quot;&quot;\n        pos = line.rfind(&#039;:&#039;)\n        while (line[pos] != &#039; &#039;):\n            pos += 1\n        while (line[pos] == &#039; &#039;):\n            pos += 1\n        file_arr = [line[0], line[pos:]]\n        return file_arr\n\nif __name__ == &quot;__main__&quot;:\n    my_ftp = MyFTP(&quot;172.28.180.117&quot;)\n    my_ftp.login(&quot;ouyangpeng&quot;, &quot;ouyangpeng&quot;)\n\n    # \u4e0b\u8f7d\u5355\u4e2a\u6587\u4ef6\n    my_ftp.download_file(&quot;G:\/ftp_test\/XTCLauncher.apk&quot;, &quot;\/App\/AutoUpload\/ouyangpeng\/I12\/Release\/XTCLauncher.apk&quot;)\n\n    # \u4e0b\u8f7d\u76ee\u5f55\n    # my_ftp.download_file_tree(&quot;G:\/ftp_test\/&quot;, &quot;App\/AutoUpload\/ouyangpeng\/I12\/&quot;)\n\n    # \u4e0a\u4f20\u5355\u4e2a\u6587\u4ef6\n    # my_ftp.upload_file(&quot;G:\/ftp_test\/Release\/XTCLauncher.apk&quot;, &quot;\/App\/AutoUpload\/ouyangpeng\/I12\/Release\/XTCLauncher.apk&quot;)\n\n    # \u4e0a\u4f20\u76ee\u5f55\n    # my_ftp.upload_file_tree(&quot;G:\/ftp_test\/&quot;, &quot;\/App\/AutoUpload\/ouyangpeng\/I12\/&quot;)\n\n    my_ftp.close()\n<\/code><\/pre>\n<h2><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>3.1 \u6d4b\u8bd5\u4e0b\u8f7d\u8fdc\u7a0b\u5355\u4e2a\u6587\u4ef6<\/h2>\n<p>\u6211\u4eec\u5c06 \u7a0b\u5e8f\u5165\u53e3\u6539\u4e3a\u5982\u4e0b\u6240\u793a\u7684\u4ee3\u7801\uff0c\u6d4b\u8bd5\u4e0b\u4e0b\u8f7d\u5355\u4e2a\u6587\u4ef6<\/p>\n<p>\u6d4b\u8bd5\u524d\u7684\u6d4b\u8bd5\u73af\u5883\u5982\u4e0b\u56fe\u6240\u793a\uff1a<br \/>\n<img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/04ef8a711940695e87fd5e1450596f00.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<pre><code>if __name__ == &quot;__main__&quot;:\n    my_ftp = MyFTP(&quot;172.28.180.117&quot;)\n    my_ftp.login(&quot;ouyangpeng&quot;, &quot;ouyangpeng&quot;)\n\n    # \u4e0b\u8f7d\u5355\u4e2a\u6587\u4ef6\n    my_ftp.download_file(&quot;G:\/ftp_test\/XTCLauncher.apk&quot;, &quot;\/App\/AutoUpload\/ouyangpeng\/I12\/Release\/XTCLauncher.apk&quot;)\n\n    my_ftp.close()\n<\/code><\/pre>\n<p>\u8fd0\u884c\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre><code>&quot;C:\\Code Python\\JenkinsAPI\\venv\\Scripts\\python.exe&quot; &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; 220 (vsFTPd 2.3.5) \n\n2018-02-06 ---&gt; download_file()---&gt; local_path = G:\/ftp_test\/XTCLauncher.apk ,remote_path = \/App\/AutoUpload\/ouyangpeng\/I12\/Release\/XTCLauncher.apk \n\n2018-02-06 ---&gt; local_file_size:-1  , remote_file_size:16749148 \n\n2018-02-06 ---&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;\u4e0b\u8f7d\u6587\u4ef6 G:\/ftp_test\/XTCLauncher.apk ... ... \n\n2018-02-06 ---&gt; close()---&gt; FTP\u9000\u51fa \n\nProcess finished with exit code 0\n<\/code><\/pre>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/8095d9ac65e70001fdc87cc92188c6c5.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u5237\u65b0\u4e0b\u76ee\u5f55\uff0c\u67e5\u770b\u6587\u4ef6\u5df2\u7ecf\u4e0b\u8f7d\u6210\u529f\uff01<br \/>\n<img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/45eb59ec3ca9307eda777d0dfa7b5393.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<h2><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>3.2 \u6d4b\u8bd5\u4e0b\u8f7d\u8fdc\u7a0b\u76ee\u5f55<\/h2>\n<p>\u6211\u4eec\u5c06 \u7a0b\u5e8f\u5165\u53e3\u6539\u4e3a\u5982\u4e0b\u6240\u793a\u7684\u4ee3\u7801\uff0c\u6d4b\u8bd5\u4e0b\u8f7d\u6574\u4e2a\u6587\u4ef6\u5939\uff0c\u8fd0\u884c\u4e4b\u524d\u7684\u73af\u5883\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/6cd95b67fd1520017a1595ebf1bceae7.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<pre><code>if __name__ == &quot;__main__&quot;:\n    my_ftp = MyFTP(&quot;172.28.180.117&quot;)\n    my_ftp.login(&quot;ouyangpeng&quot;, &quot;ouyangpeng&quot;)\n\n    # \u4e0b\u8f7d\u76ee\u5f55\n    my_ftp.download_file_tree(&quot;G:\/ftp_test\/&quot;, &quot;App\/AutoUpload\/ouyangpeng\/I12\/&quot;)\n\n    my_ftp.close()\n<\/code><\/pre>\n<p>\u8fd0\u884c\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre><code>&quot;C:\\Code Python\\JenkinsAPI\\venv\\Scripts\\python.exe&quot; &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; 220 (vsFTPd 2.3.5) \n\ndownload_file_tree()---&gt;  local_path = G:\/ftp_test\/ ,remote_path = App\/AutoUpload\/ouyangpeng\/I12\/\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12 \n\n2018-02-06 ---&gt; \u8fdc\u7a0b\u76ee\u5f55 \u5217\u8868: [[&#039;d&#039;, &#039;Debug&#039;], [&#039;d&#039;, &#039;Release&#039;]] \n\ndownload_file_tree()---&gt; \u4e0b\u8f7d\u76ee\u5f55\uff1a Debug\ndownload_file_tree()---&gt;  local_path = G:\/ftp_test\/Debug ,remote_path = Debug\n2018-02-06 ---&gt; \u672c\u5730\u76ee\u5f55G:\/ftp_test\/Debug\u4e0d\u5b58\u5728\uff0c\u5148\u521b\u5efa\u672c\u5730\u76ee\u5f55 \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12\/Debug \n\n2018-02-06 ---&gt; \u8fdc\u7a0b\u76ee\u5f55 \u5217\u8868: [] \n\n2018-02-06 ---&gt; \u8fd4\u56de\u4e0a\u5c42\u76ee\u5f55 \/App\/AutoUpload\/ouyangpeng\/I12 \n\ndownload_file_tree()---&gt; \u4e0b\u8f7d\u76ee\u5f55\uff1a Release\ndownload_file_tree()---&gt;  local_path = G:\/ftp_test\/Release ,remote_path = Release\n2018-02-06 ---&gt; \u672c\u5730\u76ee\u5f55G:\/ftp_test\/Release\u4e0d\u5b58\u5728\uff0c\u5148\u521b\u5efa\u672c\u5730\u76ee\u5f55 \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12\/Release \n\n2018-02-06 ---&gt; \u8fdc\u7a0b\u76ee\u5f55 \u5217\u8868: [[&#039;-&#039;, &#039;XTCLauncher.apk&#039;]] \n\ndownload_file()---&gt; \u4e0b\u8f7d\u6587\u4ef6\uff1a XTCLauncher.apk\n2018-02-06 ---&gt; download_file()---&gt; local_path = G:\/ftp_test\/Release\\XTCLauncher.apk ,remote_path = XTCLauncher.apk \n\n2018-02-06 ---&gt; local_file_size:-1  , remote_file_size:16749148 \n\n2018-02-06 ---&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;\u4e0b\u8f7d\u6587\u4ef6 G:\/ftp_test\/Release\\XTCLauncher.apk ... ... \n\n2018-02-06 ---&gt; \u8fd4\u56de\u4e0a\u5c42\u76ee\u5f55 \/App\/AutoUpload\/ouyangpeng\/I12 \n\n2018-02-06 ---&gt; \u8fd4\u56de\u4e0a\u5c42\u76ee\u5f55 \/App\/AutoUpload\/ouyangpeng \n\n2018-02-06 ---&gt; close()---&gt; FTP\u9000\u51fa \n\nProcess finished with exit code 0\n<\/code><\/pre>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/d71bcc3bcb614316672f3aee17f77f4d.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/3949a3d70b0791a514e9787d88305072.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u5237\u65b0\u4e0b\u76ee\u5f55\uff0c\u67e5\u770b\u6574\u4e2a\u76ee\u5f55\u5df2\u7ecf\u4e0b\u8f7d\u6210\u529f\uff01<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/ac4d01dd9533895077f04a94fdd46822.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\u4e5f\u6210\u529f\u4e0b\u8f7d\u4e0b\u6765<br \/>\n<img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/d7f81d434ac73aa337eb8ac341bb386c.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<h2><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>3.3 \u6d4b\u8bd5\u4e0a\u4f20\u5355\u4e2a\u6587\u4ef6\u5230\u8fdc\u7a0bFTP\u670d\u52a1\u5668<\/h2>\n<p>\u6211\u4eec\u5c06 \u7a0b\u5e8f\u5165\u53e3\u6539\u4e3a\u5982\u4e0b\u6240\u793a\u7684\u4ee3\u7801\uff0c\u6d4b\u8bd5\u4e0b\u8f7d\u6574\u4e2a\u6587\u4ef6\u5939\uff0c\u8fd0\u884c\u4e4b\u524d\u7684\u73af\u5883\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/55cb1a41fb8209f43833ebc9e7af7107.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<pre><code>if __name__ == &quot;__main__&quot;:\n    my_ftp = MyFTP(&quot;172.28.180.117&quot;)\n    my_ftp.login(&quot;ouyangpeng&quot;, &quot;ouyangpeng&quot;)\n\n    # \u4e0a\u4f20\u5355\u4e2a\u6587\u4ef6\n    my_ftp.upload_file(&quot;G:\/ftp_test\/Release\/XTCLauncher.apk&quot;, &quot;\/App\/AutoUpload\/ouyangpeng\/I12\/Release\/XTCLauncher.apk&quot;)\n\n    my_ftp.close()\n<\/code><\/pre>\n<p>\u8fd0\u884c\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre><code>&quot;C:\\Code Python\\JenkinsAPI\\venv\\Scripts\\python.exe&quot; &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; 220 (vsFTPd 2.3.5) \n\n2018-02-06 ---&gt; local_file_size:16749148  , remote_file_size:-1 \n\n2018-02-06 ---&gt; \u4e0a\u4f20: G:\/ftp_test\/Release\/XTCLauncher.apk\u6210\u529f! \n\n2018-02-06 ---&gt; close()---&gt; FTP\u9000\u51fa \n\nProcess finished with exit code 0\n<\/code><\/pre>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/30add94e154da6b49844018f42fef94a.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u5237\u65b0\u4e0b\u754c\u9762\uff0c\u53ef\u4ee5\u770b\u5230\u6587\u4ef6\u4e0a\u4f20\u6210\u529f\u4e86\uff01<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/5f156d956aa45397bbafe05da04ce6a5.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<h2><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>3.4 \u6d4b\u8bd5\u4e0a\u4f20\u6587\u4ef6\u5939\u5230\u8fdc\u7a0bFTP\u670d\u52a1\u5668<\/h2>\n<p>\u6211\u4eec\u5c06 \u7a0b\u5e8f\u5165\u53e3\u6539\u4e3a\u5982\u4e0b\u6240\u793a\u7684\u4ee3\u7801\uff0c\u6d4b\u8bd5\u4e0b\u8f7d\u6574\u4e2a\u6587\u4ef6\u5939\uff0c\u8fd0\u884c\u4e4b\u524d\u7684\u73af\u5883\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/d229c21a2ed242e912cdc63640722751.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<pre><code>if __name__ == &quot;__main__&quot;:\n    my_ftp = MyFTP(&quot;172.28.180.117&quot;)\n    my_ftp.login(&quot;ouyangpeng&quot;, &quot;ouyangpeng&quot;)\n\n    # \u4e0a\u4f20\u76ee\u5f55\n    my_ftp.upload_file_tree(&quot;G:\/ftp_test\/&quot;, &quot;\/App\/AutoUpload\/ouyangpeng\/I12\/&quot;)\n\n    my_ftp.close()\n<\/code><\/pre>\n<p>\u8fd0\u884c\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre><code>&quot;C:\\Code Python\\JenkinsAPI\\venv\\Scripts\\python.exe&quot; &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; 220 (vsFTPd 2.3.5) \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12 \n\n2018-02-06 ---&gt; \u76ee\u5f55\u5df2\u5b58\u5728 Debug ,\u5177\u4f53\u9519\u8bef\u63cf\u8ff0\u4e3a\uff1a550 Create directory operation failed. \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u76ee\u5f55\uff1a Debug \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12\/Debug \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u76ee\u5f55\uff1a Release \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12\/Release \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a XTCLauncher.apk \n\n2018-02-06 ---&gt; local_file_size:16749148  , remote_file_size:-1 \n\n2018-02-06 ---&gt; \u4e0a\u4f20: G:\/ftp_test\/Release\\XTCLauncher.apk\u6210\u529f! \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a v1.jpg \n\n2018-02-06 ---&gt; local_file_size:203677  , remote_file_size:-1 \n\n2018-02-06 ---&gt; \u4e0a\u4f20: G:\/ftp_test\/v1.jpg\u6210\u529f! \n\n2018-02-06 ---&gt; close()---&gt; FTP\u9000\u51fa \n\nProcess finished with exit code 0\n<\/code><\/pre>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/e5d5eaa5acfc28d72ede85d62ae0bca7.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/7d9762898f92450b5f16f0a6ea329090.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u5237\u65b0\u4e0b\u754c\u9762\uff0c\u53ef\u4ee5\u770b\u5230\u6587\u4ef6\u4e0a\u4f20\u6210\u529f\u4e86\uff01<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/e25c462f7d4881720b7ef0e4eb4911f8.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/45c4b698f9acc5d95aa1b9ac4359e019.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<h1><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>3.5 \u89e3\u51b3\u4e2d\u6587\u7f16\u7801\u5954\u6e83\u7684\u95ee\u9898<\/h1>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/d3be6d8b608d4d5e6b2edca679e95a1b.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><br \/>\n\u51c6\u5907\u4e0a\u4f20\u542b\u6709\u4e2d\u6587\u7684\u6587\u4ef6\u5230FTP\u670d\u52a1\u5668\u7684\u65f6\u5019\uff0c\u4f1a\u5954\u6e83\uff0c\u5954\u6e83\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre><code>2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12 \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u76ee\u5f55\uff1a Debug \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12\/Debug \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a Python\u7f16\u7a0b\u5feb\u901f\u4e0a\u624b__\u8ba9\u7e41\u7410\u5de5\u4f5c\u81ea\u52a8\u5316.pdf \n\n2018-02-06 ---&gt; local_file_size:14773136  , remote_file_size:-1 \n\nTraceback (most recent call last):\n  File &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;, line 277, in &lt;module&gt;\n    my_ftp.upload_file_tree(&quot;G:\/ftp_test\/&quot;, &quot;\/App\/AutoUpload\/ouyangpeng\/I12\/&quot;)\n  File &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;, line 203, in upload_file_tree\n    self.upload_file(src, local_name)\n  File &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;, line 172, in upload_file\n    self.ftp.storbinary(&#039;STOR %s&#039; % remote_file, file_handler, buf_size)\n  File &quot;D:\\Python\\lib\\ftplib.py&quot;, line 502, in storbinary\n    with self.transfercmd(cmd, rest) as conn:\n  File &quot;D:\\Python\\lib\\ftplib.py&quot;, line 397, in transfercmd\n    return self.ntransfercmd(cmd, rest)[0]\n  File &quot;D:\\Python\\lib\\ftplib.py&quot;, line 363, in ntransfercmd\n    resp = self.sendcmd(cmd)\n  File &quot;D:\\Python\\lib\\ftplib.py&quot;, line 270, in sendcmd\n    self.putcmd(cmd)\n  File &quot;D:\\Python\\lib\\ftplib.py&quot;, line 197, in putcmd\n    self.putline(line)\n  File &quot;D:\\Python\\lib\\ftplib.py&quot;, line 192, in putline\n    self.sock.sendall(line.encode(self.encoding))\nUnicodeEncodeError: &#039;latin-1&#039; codec can&#039;t encode characters in position 11-16: ordinal not in range(256)\n\nProcess finished with exit code 1\n<\/code><\/pre>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/9782153691250f49511758bccdf28c20.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u63d0\u793a\u6211\u4eec<\/p>\n<pre><code>UnicodeEncodeError: &#039;latin-1&#039; codec can&#039;t encode characters in position 11-16: ordinal not in range(256)\n<\/code><\/pre>\n<p>\u67e5\u770b Python ftplib\u6a21\u5757\uff0c\u9ed8\u8ba4\u7684\u7f16\u7801\u5c31\u662f latin-1<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/510b510c3caac8ec996f708d03f672d4.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u6211\u4eec\u5c06\u8fd9\u4e2aftp\u7684\u7f16\u7801\u4fee\u6539\u4e0b\u5373\u53ef\u4e0a\u4f20\u6210\u529f\u3002\u5c06MyFTP\u7684 <strong><strong>init<\/strong><\/strong> \u65b9\u6cd5\u4fee\u6539\u4e0b\uff0c\u8bbe\u7f6e\u4e0bftp\u7684encoding\u4e3agbk\u5373\u53ef<\/p>\n<pre><code>    def __init__(self, host, port=21):\n        &quot;&quot;&quot; \u521d\u59cb\u5316 FTP \u5ba2\u6237\u7aef\n        \u53c2\u6570:\n                 host:ip\u5730\u5740\n\n                 port:\u7aef\u53e3\u53f7\n        &quot;&quot;&quot;\n        # print(&quot;__init__()---&gt; host = %s ,port = %s&quot; % (host, port))\n\n        self.host = host\n        self.port = port\n        self.ftp = FTP()\n        # \u91cd\u65b0\u8bbe\u7f6e\u4e0b\u7f16\u7801\u65b9\u5f0f\n        self.ftp.encoding = &#039;gbk&#039;\n\n        self.log_file = open(&quot;log.txt&quot;, &quot;a&quot;)\n        self.file_list = []\n<\/code><\/pre>\n<p>\u589e\u52a0\u4e00\u53e5 <code>self.ftp.encoding = &#039;gbk&#039;<\/code>,\u5373\u53ef\u91cd\u65b0\u8bbe\u7f6eencoding\u4e86\u3002<\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/2d1332725afdbcfc1198bffbeac2bf7e.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u518d\u6b21\u8fd0\u884c\u5373\u53ef\u6210\u529f\u4e0a\u4f20\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a<\/p>\n<p>\u8fd0\u884c\u7ed3\u679c\u4e3a\uff1a<\/p>\n<pre><code>&quot;C:\\Code Python\\JenkinsAPI\\venv\\Scripts\\python.exe&quot; &quot;C:\/Code Python\/JenkinsAPI\/ftptest.py&quot;\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u8fde\u63a5\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u5f00\u59cb\u5c1d\u8bd5\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; \u6210\u529f\u767b\u5f55\u5230 172.28.180.117 \n\n2018-02-06 ---&gt; 220 (vsFTPd 2.3.5) \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12 \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u76ee\u5f55\uff1a Debug \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12\/Debug \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a Python\u7f16\u7a0b\u5feb\u901f\u4e0a\u624b__\u8ba9\u7e41\u7410\u5de5\u4f5c\u81ea\u52a8\u5316.pdf \n\n2018-02-06 ---&gt; local_file_size:14773136  , remote_file_size:-1 \n\n2018-02-06 ---&gt; \u4e0a\u4f20: G:\/ftp_test\/Python\u7f16\u7a0b\u5feb\u901f\u4e0a\u624b__\u8ba9\u7e41\u7410\u5de5\u4f5c\u81ea\u52a8\u5316.pdf\u6210\u529f! \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u76ee\u5f55\uff1a Release \n\n2018-02-06 ---&gt; \u5207\u6362\u81f3\u8fdc\u7a0b\u76ee\u5f55: \/App\/AutoUpload\/ouyangpeng\/I12\/Release \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a XTCLauncher.apk \n\n2018-02-06 ---&gt; local_file_size:16749148  , remote_file_size:-1 \n\n2018-02-06 ---&gt; \u4e0a\u4f20: G:\/ftp_test\/Release\\XTCLauncher.apk\u6210\u529f! \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a v1.jpg \n\n2018-02-06 ---&gt; local_file_size:203677  , remote_file_size:-1 \n\n2018-02-06 ---&gt; \u4e0a\u4f20: G:\/ftp_test\/v1.jpg\u6210\u529f! \n\n2018-02-06 ---&gt; upload_file_tree()---&gt; \u4e0a\u4f20\u6587\u4ef6\uff1a XTCLauncher.apk \n\n2018-02-06 ---&gt; local_file_size:16749148  , remote_file_size:-1 \n\n2018-02-06 ---&gt; \u4e0a\u4f20: G:\/ftp_test\/XTCLauncher.apk\u6210\u529f! \n\n2018-02-06 ---&gt; close()---&gt; FTP\u9000\u51fa \n\nProcess finished with exit code 0\n<\/code><\/pre>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/93827f2f44decc66b87752b776cd9667.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/7f3a20d26522dd154b5d38c7ff52f697.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<hr \/>\n<h1><a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\"><\/a>\u56db\u3001\u53c2\u8003\u94fe\u63a5<\/h1>\n<ul>\n<li>\n<p>Python 2.7\u7cfb\u5217\u5b98\u65b9\u6587\u6863\uff1a <a href=\"https:\/\/docs.python.org\/2\/library\/ftplib.html\">https:\/\/docs.python.org\/2\/library\/ftplib.html<\/a><\/p>\n<\/li>\n<li>\n<p>Python 3.5\u7cfb\u5217\u5b98\u65b9\u6587\u6863\uff1a<a href=\"https:\/\/docs.python.org\/3.5\/library\/ftplib.html\">https:\/\/docs.python.org\/3.5\/library\/ftplib.html<\/a><\/p>\n<\/li>\n<li>\n<p>Python 3.6\u7cfb\u5217\u5b98\u65b9\u6587\u6863\uff1a<a href=\"https:\/\/docs.python.org\/3.6\/library\/ftplib.html\">https:\/\/docs.python.org\/3.6\/library\/ftplib.html<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/blog.csdn.net\/xiaoxianerqq\/article\/details\/50698555\">http:\/\/blog.csdn.net\/xiaoxianerqq\/article\/details\/50698555<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/www.cppblog.com\/fwxjj\/archive\/2011\/12\/14\/162085.html\">http:\/\/www.cppblog.com\/fwxjj\/archive\/2011\/12\/14\/162085.html<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.cnblogs.com\/hltswd\/p\/6228992.html\">https:\/\/www.cnblogs.com\/hltswd\/p\/6228992.html<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/bbs.chinaunix.net\/thread-2333189-1-1.html\">http:\/\/bbs.chinaunix.net\/thread-2333189-1-1.html<\/a><\/p>\n<\/li>\n<li>\n<ul>\n<li>*<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/98c9360cb15f1b76be07b84e7343037a.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<blockquote>\n<p>\u4f5c\u8005\uff1a\u6b27\u9633\u9e4f \u6b22\u8fce\u8f6c\u8f7d\uff0c\u4e0e\u4eba\u5206\u4eab\u662f\u8fdb\u6b65\u7684\u6e90\u6cc9\uff01<br \/>\n\u8f6c\u8f7d\u8bf7\u4fdd\u7559\u539f\u6587\u5730\u5740\uff1a<a href=\"http:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\">http:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113<\/a><\/p>\n<p>\u5982\u679c\u89c9\u5f97\u672c\u6587\u5bf9\u60a8\u6709\u6240\u5e2e\u52a9\uff0c\u6b22\u8fce\u60a8\u626b\u7801\u4e0b\u56fe\u6240\u793a\u7684\u652f\u4ed8\u5b9d\u548c\u5fae\u4fe1\u652f\u4ed8\u4e8c\u7ef4\u7801\u5bf9\u672c\u6587\u8fdb\u884c\u968f\u610f\u6253\u8d4f\u3002\u60a8\u7684\u652f\u6301\u5c06\u9f13\u52b1\u6211\u7ee7\u7eed\u521b\u4f5c\uff01<\/p>\n<\/blockquote>\n<p><img src=\"https:\/\/img-blog.csdnimg.cn\/img_convert\/cc631e723f57f10ebeac2086835c79f1.png\" alt=\"\u8fd9\u91cc\u5199\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p>\u672c\u6587\u8f6c\u81ea <a href=\"https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113\">https:\/\/blog.csdn.net\/ouyang_peng\/article\/details\/79271113<\/a>\uff0c\u5982\u6709\u4fb5\u6743\uff0c\u8bf7\u8054\u7cfb\u5220\u9664\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u80cc\u666f \u6700\u8fd1\u516c\u53f8\u7684\u4e00\u4e9b\u81ea\u52a8\u5316\u64cd\u4f5c\u9700\u8981\u4f7f\u7528Python\u6765\u5b9e\u73b0FTP\u7684\u4e0a\u4f20\u548c\u4e0b\u8f7d\u529f\u80fd\u3002\u56e0\u6b64\u53c2\u8003\u7f51\u4e0a\u7684\u4f8b\u5b50\uff0c\u64b8\u4e86\u4e00\u6bb5\u4ee3\u7801\u6765\u5b9e\u73b0\u4e86\u8be5\u529f\u80fd\uff0c\u4e0b\u9762   \u2026 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0},"categories":[34],"tags":[93,16],"_links":{"self":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts\/1295"}],"collection":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1295"}],"version-history":[{"count":2,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/1295\/revisions"}],"predecessor-version":[{"id":1300,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/1295\/revisions\/1300"}],"wp:attachment":[{"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1295"},{"taxonomy":"post_tag","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}