« 上一篇下一篇 »

Python如何实现批量文件的移动以及FTP共享自己文件夹

   无论工作中还是其他场合,经常会有文件分享的需求,比如自己下了一个4GB的电影,同事下了一个800MB的软件,其他人如果也需要这些文件,显然直接分享是最快捷、最方便、最环保的方式了,如果再重新下,既浪费时间,又浪费电。Windows自带了文件夹共享的功能,不过这玩意儿,至今我还没仔细的去折腾过,也没搞明白原理,我一直使用FTP来分享文件,如果有需要的话再弄个HTTP服务也足够应付了,我的目的仅仅只是文件分享,简单、易用是我主要关注的点。
  这种需求必然是非常普遍的,解决方法也是多种多样。比如飞鸽传书、QQ,或者各种局域网通信软件以及网盘都可以,不过这些都需要点对点的操作,也就是说对方需要什么文件,你就要把该文件发送过去,多一个人就需要多发一次,不能重用,对于程序员来说,不能接受,反复可耻!我觉得,文件服务器更符合这种需求,目前已经有很多成熟的软件可以方便的实现这种需求,比如,FTP可以选择FileZilla,HTTP可以选择Apache、Nginx。当然,成熟意味着软件更复杂,更大的学习成本、更多磁盘占用,这要看你的需求的复杂程度。


小应用  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()

   小编是个喜欢折腾的人,将一件看起来复杂、学习成本高的事情,折腾到简单、易用是我的终极爱好,这篇文章正是这种折腾后的产物,希望直接达到目的的,成熟的软件是你最好的归宿。喜欢折腾,换种程序员喜欢的说法是,我热衷于把复杂的实现,隐藏在良好命名的接口下。再换种通俗点的说法,汽车内部构造精良、结构复杂,而你只需要通过操作方向盘、刹车以及油门,就可以很好的操控它,这都归功于这些接口的友好实现。
  同样的事情,只需要一遍就好。在平时写代码,也是这样。如果我需要别人提供的一个接口,那我希望这个接口使用起来尽量简单,我只需要知道调用什么接口、传什么参数就行。我自己写代码,一定严格按照这种思路,我不认为使用者需要关注我是如何实现的,那是我的问题,使用者需要关注的是这个接口是干什么的、需要什么参数、可能返回的结果以及可能抛出的错误,分工明确,减少不必要的沟通。
  我在前面一遍文章中有提到Python--导出指定文件夹中as文件的完全限定类名,好处我就不多说了,一个字,性感!很巧的是,我在折腾这个文件分享的功能时,遇到了他,借着这个机会,又复习了一遍HTTP和FTP方面的内容。
闲话少说,首先确保装了Python,我装的是2.x版本,对了,我的操作系统是WIN7,其实对于Python来说,什么操作系统并不重要。Python内置了一个简单的HTTP服务器,只需要在命令行下面敲一行命令,一个HTTP服务器就起来了:
  后面的80端口是可选的,不填会采用缺省端口8000。注意,这会将当前所在的文件夹设置为默认的Web目录,试着在浏览器敲入本机地址:
如果当前文件夹有index.html文件,会默认显示该文件,否则,会以文件列表的形式显示目录下所有文件。这样已经实现了最基本的文件分享的目的,你可以做成一个脚本,再建立一个快捷方式,就可以很方便的启动文件分享了。如果有更多需求,完全可以根据自己需要定制,具体的请参见官方文档SimpleHTTPServer,或者直接看源码。我拷贝一段,方便参考:
  看到这里,默认你已经安装了Python,不过你还需要安装另外一个好用的工具。你知道,当需要找Chrome插件的时候,会去Google的WebStore;当需要找Firefox应用的时候,会去Mozilla的Add-ons;当你需要找Python组件的时候,你需要pip:A tool for installing and managing Python packages,安装方法就不介绍了。
Python没有内置一个直接可以用的FTP服务器,所以需要第三方组件的支持,我找到的这个组件叫pyftpdlib,首先安装:


安装完后,和HTTP服器类似,执行以下命令就可以启动一个FTP服务器了:
  后面的21端口依然是可选的,不填会随机一个,被占用的端口将跳过。在浏览器敲入本机地址:
这时候,是匿名访问,也就是用户名是anonymous,密码为空,如果想要控制访问权限,你需要自己定制服务器,具体的可以参看pyftpdlib Tutorial,我这里拷贝过来一段作为介绍:
  只看代码应该基本知道该怎么用了,add_user显然是添加用户,2121是指定端口,当然也可以随机,还有最大连接数max_cons,每个ip最大连接限制,更多的接口建议直接看docstrings。
Python第三方组件就是个大宝库,基本上我自己遇到的大部分问题都可以在这里面找到解决文案。同时,建议喜欢折腾的程序员,甚至没有程序背景的IT人员,都尝试学习一下这门语言,这对解决问题的能力以及思维的锻炼都有莫大裨益。