Python--使用线程--批量文件的移动 以及FTP共享自己文件夹

在写代码中 偶尔会遇到一些脚本和方法,有时候这些脚本程序都是用到再写。这无疑浪费了自己很多时间,自己写过一次为了防止代码的丢失不如放在博客上记录一下,如果再用到那边直接用。

第一个 小知识点os模块的具体应用

"""
我们知道有时候需要大批的文件从一个文件家转移到另外一个文件夹下,可能仅仅只能通过文件的复制和剪切到另外一个文件夹下
但是在Linux下如果你想要转移的文件夹以及文件夹下的文件比较多怎么办?通过直接命令你会发现会报一个错误就是太大了,移动不了,
这里也不说那个命令是什么了。
ok今天的代码就是帮你解决这个问题。

本代码支持Linux和windows下。
解决文件目录总共是两层的文件夹。如果文件夹目录包含三层 暂不解决思路同如下。
"""
import os
import shutil

source_floder = r'D:\source'  # 将要移动的目标文件的位置
target_floder = r'D:\target'  # 移动到的目标文件夹位置

floder_list = os.listdir(source_floder)  # 列出文件夹下所有的目录与文件
for each_floder in floder_list:  # 遍历每个文件夹下所有文件和文件夹
    if not os.path.exists(os.path.join(target_floder, each_floder)):  # 如果目标文件不存在此文件夹创建
        os.mkdir(os.path.join(target_floder, each_floder))
        file_list = os.listdir(os.path.join(source_floder, each_floder))
        for each_file in file_list:  # 循环子文件夹下所有的文件
            f_src = os.path.join(source_floder, each_floder, each_file)  # 将要移动的文件
            if not os.path.exists(os.path.join(target_floder, each_floder, each_file)):  # 判断目标文件夹中此文件是否存在
                print('正在移动文件夹')
                f_dst = os.path.join(target_floder, each_floder, each_file)
                shutil.move(f_src, f_dst)  # 不存在移动
            else:
                print('this %s 文件已经存在' % each_file)
                continue
    else:  # 如果文件夹已经存在,判断文件是否存在文件夹下。同上。
        file_list = os.listdir(os.path.join(source_floder, each_floder))
        for each_file in file_list:
            f_src = os.path.join(source_floder, each_floder, each_file)
            if not os.path.exists(os.path.join(target_floder, each_floder, each_file)):
                f_dst = os.path.join(target_floder, each_floder, each_file)
                print('正在移动文件夹')
                shutil.move(f_src, f_dst)
            else:
                print('this %s 文件已经存在' % each_file)
                continue
    shutil.rmtree(os.path.join(source_floder, each_floder))  # 当一个文件夹中的所有文件移除结束后。删除这个文件夹

   
os模块有问题的推荐参考:http://www.cnblogs.com/renpingsheng/p/7065565.html

第二个小应用。FTP共享自己文件夹
当同事之间互相需要对方电脑软件的时候而又苦于公司没有共享盘, 忘记带移动硬盘,U盘的时候不怕本文来帮助你实现。

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

# 实例化一个虚拟authorizer
authorizer = DummyAuthorizer()
# 添加一个匿名用户,并给予其访问某共享#文件夹的权限(以D://folder为例)
authorizer.add_anonymous(r'D://')
# 创建handler. 实例化一个FTPServer必须给定一个handler,这里按照文档的例子来就行。
handler = FTPHandler
handler.authorizer = authorizer
# 开启服务器。
# YOUR_IP_ADDRESS是你本机的内网#IP,可以用命令行命令 ipconfig 查到。
# 21是FTP协议的默认端口,一般不用修改。
server = FTPServer(('IP', 21), handler)
server.serve_forever()
请注意一定要把自己的防火墙关一下,不然是没办法进行共享的。
当然除了这个共享文件夹还有更厉害更简单的呢。
例如我想共享D盘下Image文件夹的东西。

第一步:进入想要共享的文件夹
	   cd D:\Image
第二步:window+R cmd命令后 执行以下命令:
	   python3 -m http.server  # python3执行这个命令
	   python -m SimpleHTTPServer # python2执行此命令
亲自试 可行。分享给你。

好了。这就是今天的一点点应用,如果有更好的方法,欢迎讨论指出。

后记

2018-11-12
这几天想了一下,就算实现了这个批量移动文件。但是速度还是提不上去呀!!怎么办?能不能利用线程来搞一波呢?
既然想了就去搞,还好写了出来,分享给大家。

import os
import shutil
import threadpool
from retry import retry


@retry(2)
def move_file(each_floder):
    each_split = each_floder.split('-')[:-5]
    tar_each = '-'.join(each_split)
    try:
        if not os.path.exists(os.path.join(target_floder, tar_each)):  # 如果目标文件不存在此文件夹创建
            os.mkdir(os.path.join(target_floder, tar_each))
            file_list = os.listdir(os.path.join(source_floder, each_floder))
            for each_file in file_list:
                f_src = os.path.join(source_floder, each_floder, each_file)
                if not os.path.exists(os.path.join(target_floder, tar_each, each_file)):
                    print('正在移动文件夹')
                    f_dst = os.path.join(target_floder, tar_each, each_file)
                    shutil.move(f_src, f_dst)
                else:
                    print('this %s 文件已经存在' % each_file)
                    continue
        else:
            file_list = os.listdir(os.path.join(source_floder, each_floder))
            for each_file in file_list:
                f_src = os.path.join(source_floder, each_floder, each_file)
                if not os.path.exists(os.path.join(target_floder, tar_each, each_file)):
                    f_dst = os.path.join(target_floder, tar_each, each_file)
                    print('正在移动文件夹')
                    shutil.move(f_src, f_dst)
                else:
                    print('this %s 文件已经存在' % each_file)
                    continue
        shutil.rmtree(os.path.join(source_floder, each_floder))
    except BaseException as e:
        print(e)


if __name__ == '__main__':
    source_floder = # 将要移动的目标文件的位置
    target_floder = # 移动到的目标文件夹位置
    task_pool = threadpool.ThreadPool(40)  # 准备5个线程池
    falg = 1
    while falg:
        try:
            requests = threadpool.makeRequests(move_file, os.listdir(source_floder))
            for req in requests:
                task_pool.putRequest(req)
            task_pool.wait()
        except BaseException as e:
            print(e)
        if len(os.listdir(source_floder)) == 0:
            falg = 0

注意其中几点:线程可能导致抢占资源从而会出现一些具体的问题。具体什么问题是根据你的需求可能会出现的。这里就不讲了。出现问题需要你认真解决一下。

你可能感兴趣的:(python,小技巧)