使用 ftplib 递归上传所有文件到 FTP 时,只有第一个目录成功传输
When uploading recursively all files to FTP using ftplib, only the first directory is successfully transferred
我正在尝试将所有包含文件和子目录的目录从 FTP 服务器复制到本地目录。目标是在第一次执行程序时创建所有这些的副本,并在其他执行时更新更改的或添加新添加的。
我的FTP目录结构是:
├── _directory1
│ ├──_subdirectory1
│ ├── file1.py
│ ├── file2.py
│ ├──_subdirectory2
│ ├── file3.py
│ ├── file4.py│
| ├──_subdirectory3
│ ├── file3.py
│ ├── file4.py
│ └── packages.py
│ └── somefile.py
│ └── somepdf.pdf
├── _directory2
│ ├──_subdirectory2.1
│ ├── file2.1.py
这是我的代码:
import os
import os.path
from ftplib import FTP, error_perm
from io import BytesIO
host = 'localhost'
username = 'user'
password = 'password'
port = 21
ftp = FTP()
ftp.connect(host, port)
ftp.login(username, password)
filenameCV = "C:/Users/User/Desktop/test"
# ftp.set_debuglevel(2)
def copy_all_files(ftp_server, path):
for filename in ftp_server.nlst():
print(filename)
try:
ftp_server.size(filename)
if os.path.exists(os.path.join(path, filename)):
with open(os.path.join(path, filename), "rb") as file:
r = BytesIO()
try:
ftp_server.retrbinary('RETR ' + filename, r.write)
if BytesIO(file.read()).getvalue() != r.getvalue():
print(filename+"has changed")
ftp_server.retrbinary('RETR ' + filename,
open(os.path.join(path, filename),
'wb').write)
except Exception as ee:
print(ee)
else:
ftp_server.retrbinary('RETR ' + filename, open(os.path.join(path, filename), 'wb').write)
except:
try:
if not os.path.exists(os.path.join(path, filename)):
os.mkdir(os.path.join(path, filename))
ftp_server.cwd(filename)
copy_all_files(ftp_server, os.path.join(path, filename))
except:
pass
copy_all_files(ftp, filenameCV)
ftp.quit()
问题是我的代码从FTP创建目录1和目录2,但只复制和更改子目录1和其中的文件,其余目录是空的,目录1级别的文件是缺少,子目录 2,3 和目录 2 是空的,目录级别的 pdf 也被复制为目录。我需要更改 ftp.cwd 或者没有被其他目录复制的原因是什么?
您在此处输入远程文件夹:
ftp_server.cwd(filename)
但你永远不会离开他们。
任一:
离开文件夹,下载内容后:
ftp_server.cwd(filename)
copy_all_files(ftp_server, os.path.join(path, filename))
ftp_server.cwd("..")
或者进入文件夹时使用绝对路径。这样 cwd
就可以工作了,无论你在那个特定的时刻在那里。喜欢这里:
Downloading a directory tree with ftplib
从广义上讲,您的问题实际上与上述问题重复——您为什么要尝试实现一些已经有可行解决方案的东西?
我正在尝试将所有包含文件和子目录的目录从 FTP 服务器复制到本地目录。目标是在第一次执行程序时创建所有这些的副本,并在其他执行时更新更改的或添加新添加的。
我的FTP目录结构是:
├── _directory1
│ ├──_subdirectory1
│ ├── file1.py
│ ├── file2.py
│ ├──_subdirectory2
│ ├── file3.py
│ ├── file4.py│
| ├──_subdirectory3
│ ├── file3.py
│ ├── file4.py
│ └── packages.py
│ └── somefile.py
│ └── somepdf.pdf
├── _directory2
│ ├──_subdirectory2.1
│ ├── file2.1.py
这是我的代码:
import os
import os.path
from ftplib import FTP, error_perm
from io import BytesIO
host = 'localhost'
username = 'user'
password = 'password'
port = 21
ftp = FTP()
ftp.connect(host, port)
ftp.login(username, password)
filenameCV = "C:/Users/User/Desktop/test"
# ftp.set_debuglevel(2)
def copy_all_files(ftp_server, path):
for filename in ftp_server.nlst():
print(filename)
try:
ftp_server.size(filename)
if os.path.exists(os.path.join(path, filename)):
with open(os.path.join(path, filename), "rb") as file:
r = BytesIO()
try:
ftp_server.retrbinary('RETR ' + filename, r.write)
if BytesIO(file.read()).getvalue() != r.getvalue():
print(filename+"has changed")
ftp_server.retrbinary('RETR ' + filename,
open(os.path.join(path, filename),
'wb').write)
except Exception as ee:
print(ee)
else:
ftp_server.retrbinary('RETR ' + filename, open(os.path.join(path, filename), 'wb').write)
except:
try:
if not os.path.exists(os.path.join(path, filename)):
os.mkdir(os.path.join(path, filename))
ftp_server.cwd(filename)
copy_all_files(ftp_server, os.path.join(path, filename))
except:
pass
copy_all_files(ftp, filenameCV)
ftp.quit()
问题是我的代码从FTP创建目录1和目录2,但只复制和更改子目录1和其中的文件,其余目录是空的,目录1级别的文件是缺少,子目录 2,3 和目录 2 是空的,目录级别的 pdf 也被复制为目录。我需要更改 ftp.cwd 或者没有被其他目录复制的原因是什么?
您在此处输入远程文件夹:
ftp_server.cwd(filename)
但你永远不会离开他们。
任一:
离开文件夹,下载内容后:
ftp_server.cwd(filename) copy_all_files(ftp_server, os.path.join(path, filename)) ftp_server.cwd("..")
或者进入文件夹时使用绝对路径。这样
cwd
就可以工作了,无论你在那个特定的时刻在那里。喜欢这里:
Downloading a directory tree with ftplib从广义上讲,您的问题实际上与上述问题重复——您为什么要尝试实现一些已经有可行解决方案的东西?