最近遇到一道考题,写完记录下来。
题目是:每隔10天在文件里搜索名单上的文件,压缩上传到远程服务器
解题分四个阶段:
- 文件搜索
os.listdir(path)
查看指定path下的文件,一般结合os.path.isfile(path)(是否为文件)使用递归对目录进行遍历
使用介绍 http://www.runoob.com/python/os-listdir.html
Tips:
• 连接文件夹和文件
• os.path.join(root,filename)
os.walk(top, topdown=True, οnerrοr=None, followlinks=False)
一般只传入第一个参数,即要遍历的路径,topdown指明遍历的顺序,该方法对于每个目录返回一个三元组,(dirpath, dirnames, filenames)。第一个是路径,第二个是路径下面的目录,第三个是路径下面的非目录(对于windows来说也就是文件)。通过for循环即可完成目录的递归了。
使用介绍 http://www.runoob.com/python/os-walk.html
glob.glob(path)
返回所有匹配的文件路径列表。它只有一个参数path,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。
-
压缩文件
zipfile 模块用来处理压缩解压文件。
is_zipfile用来判断是否是压缩文件,ZipFile压缩文件,write向压缩文件添加文件。 -
上传文件
paramiko模块用来建立和服务器连接,可以向服务器发送命令,上传和下载文件。 -
间隔运行
可以利用crontab执行一个10天运行一次该脚本。
代码:
import os
import zipfile
import glob
import paramiko
if name == “main”:
path = “/test”
serachFileName = “test.txt”
zipfilename= “/test/test.zip”
remoteFile = “/root/test.zip”
# test login server successfully
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("192.168.1.1", 22, "root", "xxx")
stdin, stdout, stderr = ssh.exec_command("ls")
print(stdout.readlines())
ssh.close()
#上传文件的方式和发送命令的方式不一样。
t = paramiko.Transport(("192.168.1.1", 22))
t.connect(username="root", password="x")
sftp = paramiko.SFTPClient.from_transport(t)
for root, dirs, files in os.walk(path, topdown=False):
if serachFileName in files:
file = os.path.join(root, serachFileName)
z = zipfile.ZipFile(zipfilename, 'w')
print(file)
z.write(file, serachFileName)
print(z.filelist)
z.close()
print(zipfilename)
sftp.put(zipfilename, remoteFile)
t.close()
#以上结束。下面是一些探索
# 可以找到所有文件夹下符合该条件的文件
pathList = glob.glob(os.path.join('/', path, "test*"))
print(pathList)
# 只能找当年目前下文件,不能文件夹内部文件夹遍历
for file in os.listdir(path):
if file == serachFileName:
print(file)
github code:
https://github.com/szhmery/algorithms/blob/master/exam/zipUploadFile.py