使用ftplib和多重处理上传多个文件

刘雄

我正在尝试使用ftp多个文件。但是,它不是上载多个不同的文件,而是上载了一个文件多次。它出什么问题了?

import fnmatch
import os
from multiprocessing import Pool
import ftplib

file_extensions = [ '*.mp4', '*wmv' ]
matches = []
#match = []
exclude = "/ext_hdd/download/incomplete"
def upload(file):
    ftp = ftplib.FTP('ftp.domain.com')
    ftp.login("username","password")
    f = open(match,'rb')
    print ("uploading" + match)
    ftp.storbinary('STOR %s' %match, f)
    f.close()
    ftp.quit()

for root, dirs, filenames in os.walk("/ext_hdd/download"):
        dirs[:] = [d for d in dirs if d not in exclude]
        for extension in file_extensions:
          for filename in fnmatch.filter(filenames, extension):
                  matches.append(os.path.join(root, filename))
                  (match for match in matches if file_size > 209715200)
                  #print matches
                  for match in matches:
                        pool = Pool(2)
                    pool.map(upload,match)
损害

有几个问题。首先,您要遍历给定目录中与某个文件扩展名匹配的所有文件,并将其添加到名为的列表中matches但是然后,在该for循环内,您还要遍历matches并调用Pool.map每个项目。这意味着,如果您有两个匹配的文件,则您的代码基本上等效于此:

for filename in ["file1.mp4", "file2.mp4"]:
    matches.append(os.path.join(root, filename))
    for match in matches:
        pool_stuff(filename)

这将最终调用pool_stufffilename两倍,因为它遍历matches两次。您的代码也发生了同样的事情

第二个问题是,您要Pool在内部循环的每次迭代中创建一个新对象,而这根本不是您想要做的。您只想创建Pool一次,并将所有匹配项传递给它。您也不需要使用map,因为您一次将一个任务传递给Pool相反,您可以apply_async在对文件进行迭代/筛选时使用传递任务。这是一个清理的示例。

import fnmatch
import os
from multiprocessing import Pool
import ftplib

file_extensions = [ '*.mp4', '*wmv' ]
exclude = "/ext_hdd/download/incomplete"
def upload(match):
    ftp = ftplib.FTP('ftp.domain.com')
    ftp.login("username","password")
    f = open(match,'rb')
    print ("uploading" + match)
    ftp.storbinary('STOR %s' %match, f)
    f.close()
    ftp.quit()

if __name__ == "__main__":
    pool = Pool(2)
    tasks = []
    for root, dirs, filenames in os.walk("/ext_hdd/download"):
        for extension in file_extensions:
            for filename in fnmatch.filter(filenames, extension):
                match = os.path.join(root, filename)
                tasks.append(pool.apply_async(upload, args=(match,)))

    # Get the result of each task, just so any 
    # exceptions thrown in the workers will be raised.
    for task in tasks:
        task.get() 
    pool.close()
    pool.join()

请注意,我从您的原始示例中删除了一些似乎并未真正用于任何代码的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

IFileRepositoryProvider处理上传的文件

来自分类Dev

html 输入,上传 onchange 不处理上传相同的文件

来自分类Dev

使用Flask作为代理上传文件?

来自分类Dev

使用Plack处理多个文件上传

来自分类Dev

在Wordpress插件开发中处理上传的文件

来自分类Dev

如何在PrimeNG中处理上传的文件

来自分类Dev

使用uploader.php类使用php和jquery处理多个文件上传

来自分类Dev

使用PHP和JQuery上传多个文件

来自分类Dev

使用VueJs和Laravel上传多个文件

来自分类Dev

“同步”处理多个上传的文件

来自分类Dev

使用Python ftplib上传后无法删除文件

来自分类Dev

上传和处理文件进度

来自分类Dev

上传和处理文件进度

来自分类Dev

在多个Python版本中使用多重处理

来自分类Dev

使用Bottle上传和处理CSV文件;可能的编码问题

来自分类Dev

处理上传图片django admin python

来自分类Dev

使用具有多个返回值和有序字典的多重处理

来自分类Dev

使用jquery和coldfusion cffile上传多个文件

来自分类Dev

如何使用PHP,jQuery和AJAX上传多个文件

来自分类Dev

使用Spring Boot和Thymeleaf上传多个文件

来自分类Dev

如何使用JavaScript和FastAPI上传多个文件?

来自分类Dev

如何使用PHP,jQuery和AJAX上传多个文件

来自分类Dev

如何使用cloudinary和carrierwave上传多个文件

来自分类Dev

使用go处理文件上传

来自分类Dev

Extjs 4.1-多重选择和上传文件

来自分类Dev

在Sails.js中使用船长处理上传(正在进行中)

来自分类Dev

使用PHP上传多个文件

来自分类Dev

使用Javascript上传多个文件

来自分类Dev

使用数组上传多个文件