主要介绍几个用到的python模块的使用方法。
python 含有丰富的内置和第三方库,企图全部掌握并精通那是不可能的。
但当你开发任务需要到的时候,你可以及时的避免重复的一些操作。
同时你可以从你使用的这些库中学习:
- 项目的文档结构
- 项目的代码风格
- 组织结构
- 代码扩展能力
- API的设计
......
1. os
主要是完成的是对文件、文件目录等的操作。
2. sys
主要完成的是对系统参数,输入输出的操作。
3. subprocess
主要完成的是执行shell 命令,得到输入输出错误信息等。
4. paramiko
主要完成的是登入远程服务器,执行shell命令,远程文件上传、下载操作。
一般你要登入远程服务器进行操作你会怎么做:
- ssh 登入远程服务器
- 执行命令
- sftp get: 下载文件
- sftp put: 上传文件
- scp 上传下载文件
paramiko 就是封装了这些操作,提供接口供你使用。
5. SQLalchemy
主要是ORM技术,完成对数据库的高级封装,主要属性增删改查API。
6. tempfile
主要是创建临时文件,完成读写等功能。
7. tarfile
主要是完成对文件的打包和解包操作。
好了,具体如何操作可以看看文档:
为了讲述这几个模块,我假定了这样一个任务:
前提:
服务器/root/ 目录下有一个data文件:
/root/data
├── info.list
└── learn.list
这两个文件内容是:
info.list:
{
"age": 26,
"university": "shanghai university",
"major": "automation",
"habits": ["Learning", "Reading", "Writing"],
"slogan": "day day up"
}
learn.list:
{
"subject one": "Programing",
"subject two": "Jobs",
"subject three": "New Media Operation",
"subject four": "PPT"
}
我们最终的目的是"曲折"的完成通过:/api.example.com/information
api 接口获取这两个文件的内容:
具体如下:
curl http://127.0.0.1:5000/api.example.com/information
{
"info": {
"resource": [
{
"age": 26,
"habits": [
"Learning",
"Reading",
"Writing"
],
"major": "automation",
"slogan": "day day up",
"university": "shanghai university"
},
{
"subject four": "PPT",
"subject one": "Programing",
"subject three": "New Media Operation",
"subject two": "Jobs"
}
]
}
}
为了"曲折"的既完成使用到上述几个模块,又完成目的,代码中做了部门没有实际作用的工作,谢谢。
- 登入远程服务器:paramiko
- 将远程数据进行打包操作:shell tar 命令 :data.tar.gz
- 将远程数据进行下载到本地:sftp
- 解压指定下载的data.tar.gz 文件到指定目录下:extract_data/ : tarfile
- 读取解压的文件:info.list, learn.list : os
- restful api 访问获取的数据: flask
1. 登入远程服务器
使用paramiko 模块:实例化sshclient对象,和sftp对象
class RemoteOperation(object):
def __init__(self, hostname, user, password):
self.hostname = hostname
self.user = user
self.password = password
self.ssh = paramiko.SSHClient() # 实现登录和执行shell 命令
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.transport = paramiko.Transport((self.hostname, 22))
self.transport.connect(
username=self.user,
password=self.password
)
self.sftp = paramiko.SFTPClient.from_transport(
self.transport
) # 实现服务器之间的文件上传和传输功能
def login(self):
try:
self.ssh.connect(
hostname=self.hostname,
port=22,
username=self.user,
password=self.password
)
return "OK"
except Exception as e:
return str(e)
pass
2. 将远程数据进行打包操作
sshclient 对象执行exec_command()方法
def cmd(self, cmd):
cmd = str(cmd)
try:
self.ssh.exec_command(cmd)
return "OK"
except Exception as e:
return str(e)
cmd('tar -zxcf data.tar.gz data/)
3. 将打包的data.tar.gz 文件下载至指定目录下
def get(self, remotepath, localpath):
try:
self.sftp.get(remotepath, localpath)
self.transport.close()
return 'OK'
except Exception as e:
return str(e)
def put(self, localpath, remotepath):
try:
self.sftp.put(localpath, remotepath)
self.transport.close()
return 'OK'
except Exception as e:
return str(e)
# get 实现下载
# put 实现上传
# 指定目录为:E:\PythonProject\Exercise\data
path = r'E:\PythonProject\Exercise\data'
get(remotepath='/root/data.tar.gz', localpath=path + str('\data.tar.gz'))
4. 解压下载的data.tar.gz 文件到指定目录下
def vtarfiles(self, file, path):
t = tarfile.open(file, 'r:gz')
t.extractall(path=path)
pass
def ctarfiles(self, file, path):
t = tarfile.open(file, 'w:gz')
list_file = os.listdir(path)
print(list_file)
for one in list_file:
one = os.path.join(path, one)
print(one)
t.add(one, arcname=file)
# vtarfile 实现解压文件功能
# ctarfile 实现压缩文件功能
example.vtarfiles(r'E:\PythonProject\Exercise\data\data.tar.gz', path=r'E:\PythonProject\Exercise\extract_data')
example.ctarfiles(file=r'E:\PythonProject\Exercise\data\datatempfile.tar.gz',
path=r'E:\PythonProject\Exercise\extract_data\data')
5. 读取解压的文件:info.list, learn.list
def get_info(self, path):
list_path = os.listdir(path)
data = []
for one in list_path:
one = os.path.join(path, one)
data.append(self.parse_info(one))
return {'resource': data}
def parse_info(self, file):
if file.endswith('list'):
with open(file, 'r') as f:
return eval(f.read())
6. restful api 访问获取的数据: flask
@app.route('/api.example.com/information', methods=['GET'])
def get_infos():
json_info = example.get_info(path=r'E:\PythonProject\Exercise\extract_data\data')
return jsonify(info=json_info)
7. 执行curl 命令读取结果
curl -i http://127.0.0.1:5000/api.example.com/information