我正在尝试使用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_stuff
上filename
两倍,因为它遍历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] 删除。
我来说两句