【问题标题】:What's the easiest way to retrieve FTP files based on a list of filenames (in multiple FTP directories) - Python根据文件名列表(在多个 FTP 目录中)检索 FTP 文件的最简单方法是什么 - Python
【发布时间】:2021-10-14 17:30:45
【问题描述】:

在 FTP 中,结构如下所示:

main_folder / year / month / day / multiple csv files

例如:

main_folder / 2020 / 02 / 03 / '2020-02-03_01.csv', '2020-02-03_02.csv', '2020-02-03_03.csv', .....

main_folder / 2020 / 03 / 03 / '2020-03-03_01.csv', '2020-03-03_02.csv', '2020-03-03_03.csv', .....
main_folder / 2021 / 01 / 01 / '2021-01-01_01.csv', '2021-01-01_02.csv', '2021-01-01_03.csv', .....

所以每年有12个文件夹(每个月一个),每个月有多个文件夹(一天一个),每天有多个csv文件(文件名由date_xx.csv组成)。

我有一个要下载的文件名列表,例如:

example_list = ['2021-08-09_01.csv', '2021-08-09_02.csv', '2021-08-10_12.csv',
                '2021-08-10_03.csv']

我当前的代码行为是这样的:从文件名中提取日期year/month/day -> 然后在FTP中构造相应的目录,例如对于文件'2021-08-09_01.csv',它将查看目录main_folder/2021/08/09下的所有文件,但是如果我使用完整目录告诉 FTP 只查看特定文件,它给了我错误ftplib.error_perm: 550 No such directory.

这是代码:

file_dir = "main_folder/2021/08/09/2021-08-09_01.csv"

ftp_conn = open_ftp_connection(ftp_host, ftp_username, ftp_password, file_dir)
ftp = ftplib.FTP_TLS(host)
ftp.login(username, password)
ftp.cwd(file_dir)

这里有点迷茫,我怎么告诉FTP去对应目录下查找那些文件并读取它们的数据(最终目标是发布到s3 bucket)

【问题讨论】:

  • 更改目录时,必须对目录本身进行,而不是对目录中的文件进行。尝试ftp.cwd(main_folder/2021/08/09) 然后下载文件。
  • 在这之后,如何告诉FTP只下载目标文件而不是下载main_folder/2021/08/09下的所有文件?
  • 给我几分钟,我给你举个例子。
  • 非常感谢(这几天我一直在为 FTP 苦苦挣扎......)
  • 只需将实际文件名提供给retrbinary 调用。见stackoverflow.com/q/11573817/850848#39719174

标签: python python-3.x list ftp ftplib


【解决方案1】:

我会这样做:

import ftplib, os

example_list = ['2021-08-09_01.csv', '2021-08-09_02.csv', '2021-08-10_12.csv', '2021-08-10_03.csv']

FTP_IP = "1.2.3.4"
FTP_LOGIN = "username"
FTP_PASSWD = "password"
CURRENT_DIR = os.getcwd()
MAIN_DIR = "/main_folder"

with ftplib.FTP(FTP_IP, FTP_LOGIN, FTP_PASSWD) as ftp:
    for entry in example_list:
        filesplit = entry.split("-")
        directory = "main_folder/"+filesplit[0]+"/"+filesplit[1]+"/"+filesplit[2].split("_")[0]
        ftp.cwd(directory)
        with open(os.path.join(CURRENT_DIR, entry), 'wb') as f:
            ftp.retrbinary(entry, f.write)
        ftp.cwd(MAIN_DIR)

该文件将被下载到目录中,您可以在该目录中使用与服务器上相同的文件名执行 python 脚本。

【讨论】:

  • 您好,谢谢您,如果我没有文件名列表,我只想下载 FTP 中可用的每个 csv 文件,而不是多次更改 FTP 目录,是否有简单的方法吗?
  • 这不是和你之前要求的完全相反吗?:"我如何告诉FTP只下载目标文件而不是下载所有文件"
  • 是的,确实如此,我意识到我的用户案例需要这两种机制,我终于解决了它们,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2011-05-26
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多