pycurl之公共方法--请求/上传/下载,解析json

  1 # -*- coding=utf-8 -*-
  2 #curl公共程序
  3 #张明伟 20200331
  4 import pycurl
  5 from io import BytesIO
  6 import  datetime,time,os
  7 import  logging
  8 import json
  9 from logging import handlers
 10 testdebug=1 #测试模式:1为是,0为否
 11 if testdebug:
 12     ip = ‘221.122.125.207‘ #测试环境IP
 13 else:
 14     ip = ‘221.122.125.201‘ #正式环境IP
 15
 16 pth=os.getcwd()+os.sep+‘data‘+os.sep
 17 logpath =os.getcwd() + os.sep + ‘logs‘ + os.sep
 18
 19 #返回当前日期
 20 def dtnow():
 21     return datetime.datetime.today().strftime(‘%Y%m%d‘)
 22
 23 #返回文件名相关信息
 24 def filestr(filename):
 25     filepath,tmpfile=os.path.split(filename)
 26     basename,extention=os.path.splitext(tmpfile)
 27     return filepath,tmpfile,basename,extention
 28
 29 #暂时不用
 30 def init():
 31     dt=(datetime.datetime.today()+datetime.timedelta(days=-1)).strftime(‘%Y-%m-%d‘)
 32     rdt=dt.replace(‘-‘,‘‘)
 33     logfile=‘bigdata‘+rdt+‘.log‘
 34     logging.basicConfig(level=logging.INFO,format=‘%(asctime)s-%(filename)s.%(module)s.%(funcName)s:%(lineno)s:%(message)s‘,filename=logfile)
 35     logging.info("系统金额我发你")
 36     print(os.path.exists(logfile))
 37
 38 #curlcmd用于上传下载,scp文件,http请求
 39 #op=download/upload 下载或上传 默认是下载,上传时需要传入filename,http请求时需要data
 40 def curlcmd(url,op="download",filename=None,data=""):
 41     if not filename:
 42         filename=‘‘
 43     c = pycurl.Curl()
 44     c.setopt(pycurl.SSL_VERIFYPEER, False)  #ssl不信任或无证书时需要设置这个 等同于curl -k/--insecure 参数
 45     c.setopt(pycurl.SSL_VERIFYHOST, False)  #
 46     c.setopt(pycurl.URL, url+filename)  #上传时需要指定上传文件名,所以filename加入到url中
 47     c.fp = BytesIO()    #设置输出
 48     c.setopt(pycurl.POST, 1)  #以POST方式提交
 49     # c.setopt(pycurl.POSTFIELDS, urllib.urlencode(data))
 50     if isinstance(data,list): #提交大量数据
 51         c.setopt(pycurl.HTTPPOST, data)
 52     elif isinstance(data,dict): #json格式的数据上传 对应着大量的表单数据提交
 53         c.setopt(pycurl.POSTFIELDS,json.dumps(data))
 54     c.setopt(pycurl.USERPWD, "ftpuser:[email protected]") #用户名密码
 55     c.setopt(pycurl.WRITEFUNCTION, c.fp.write) #curl执行结果
 56
 57     #print(data,url,op,filename)
 58     if op=="upload": #上传文件
 59         if not filename:
 60             raise Exception("请输入上传文件名!")
 61         filename1=pth+filename
 62         filename1size=os.path.getsize(filename1)
 63         c.setopt(pycurl.UPLOAD, True) #设置上传标志
 64         c.setopt(pycurl.INFILESIZE, filename1size) #上传需要传入文件大小标志
 65         # c.setopt(pycurl.READFUNCTION, open(filename1,"rd").read(filename1size))
 66         c.setopt(pycurl.READFUNCTION, open(filename1, "rb").read)
 67     # print(data, ‘@@@@@@‘)
 68     # print(urllib.urlencode(data))
 69     c.perform()  #curl中真正的执行
 70     code = c.getinfo(c.HTTP_CODE) #获取返回码
 71     html = c.fp.getvalue()   #获取返回结果
 72     print(html)
 73     return {‘code‘:code,‘html‘:html} #返回json格式
 74
 75 #日志类
 76 class Logger(object):
 77     level_relations={
 78         ‘debug‘:logging.DEBUG,
 79         ‘info‘:logging.INFO,
 80         ‘waining‘:logging.WARNING,
 81         ‘error‘:logging.ERROR,
 82         ‘crit‘:logging.CRITICAL
 83     }
 84
 85     def __init__(self,filename=None,level=‘debug‘,when=‘D‘,backCount=3,fmt=‘%(asctime)s-%(filename)s.%(module)s.%(funcName)s:%(lineno)s:%(message)s‘):
 86         if not os.path.exists(logpath):
 87             os.mkdir(logpath)
 88         if filename is None:
 89             filename=filestr(__file__)[2]  #返回无后缀的文件名
 90         logfile=logpath+filename+dtnow()+‘.log‘
 91         self.logger=logging.getLogger(logfile)
 92         format_str=logging.Formatter(fmt)
 93         self.logger.setLevel(self.level_relations.get(level))
 94         sh=logging.StreamHandler()
 95         sh.setFormatter(format_str)
 96         th=handlers.TimedRotatingFileHandler(filename=logfile,when=when,backupCount=backCount)
 97         th.setFormatter(format_str)
 98         self.logger.addHandler(sh)
 99         self.logger.addHandler(th)
100
101 #json数据类型解析
102 class expressDict():
103     fldlist = []  # type:list  #字段名列表
104     valuelist = []  # type:list #值列表
105     sql = ""  #SQL INSERT语句列表
106     valuesql = "" #SQL值语句列表
107
108     def __init__(self,jsstr,sqlquote="‘"):
109         self.jsstr = jsstr
110         self.sqlquote = "‘"
111         self.tabname = ""
112         self.sqls=[]
113         self.sqlFlag = True  #默认是需要得到SQL语句
114         # self.fldlist=[] #type:list
115         # self.valuelist=[] #type:list
116         # self.sql = ""
117         # self.valuesql = ""
118
119     #数据处理后再次重置数据
120     def __clear(self):
121         self.fldlist = []  # type:list
122         self.valuelist = []  # type:list
123         self.sql = ""
124         self.valuesql = ""
125
126     def __display_item(self, jsstr):
127         """
128         根据json格式自动生成SQL语句或文件:递归
129         文件存放在{pth}目录下
130         sqlFlag默认为真,为真时产生sql语句,否则生成脚本
131         :param jsstr:
132         :return:
133         """
134         #文件格式存放时不需要分割符
135         if not self.sqlFlag:
136             self.sqlquote=""
137         #如果json格式中数据库字典格式,则把键值做为表名
138         if isinstance(jsstr, dict):
139             for k,v in jsstr.items():
140                 if not isinstance(v,list):
141                     self.fldlist.append(k)
142                     self.valuelist.append(v)
143                     # print(k,‘--->‘,v)
144                     self.sql=self.sql+k+‘,‘
145                     self.valuesql=self.valuesql+self.sqlquote+v+self.sqlquote+‘,‘
146                 else:
147                     if not k:
148                         # print(self.tabname,"*" * 20)
149                         pass
150                     else:
151                         if k == self.tabname:
152                             self.sql = self.sql+‘) ‘
153                         self.tabname=k
154                 # print(self.tabname+‘@@@@@@@‘)
155                 self.__display_item(v)
156         # 如果json格式中数据库列表格式,则把其他数据做库数据值
157         elif isinstance(jsstr, list):
158             for jslst in jsstr:
159                 if self.sqlFlag:
160                     self.sql=self.sql+"insert into %s (" %(self.tabname)
161                     self.__display_item(jslst)
162                     self.sql = self.sql.strip(‘,‘) + ") values ("+self.valuesql.strip(‘,‘)+");"
163                     self.sqls.append(self.sql)
164                     self.__clear()
165                 else:
166                     finame = pth + self.tabname + ‘_‘ + dtnow() + ‘.del‘
167                     self.__display_item(jslst)
168                     data = self.valuesql.strip(‘,‘) + os.linesep  # type:str
169                     self.__clear()
170                     print(finame, data)
171                     with open(finame, ‘a+‘) as fp:
172                         fp.write(data.encode("utf-8"))
173
174     def display_items(self,sqlFlag=True):
175         # return self.display_item(self.jsstr)
176         self.sqlFlag=sqlFlag
177         return self.__display_item(self.jsstr)
178
179     def dispay_sqls(self):
180         for sql in self.sqls:
181             print(sql)
182         # print(self.valuesql)
183
184 # curl -k -v -T "{table_name1_20200403.del,table_name2_20200403.del}" -u ftpuser scp://21.12.2.196/tmp/
185 # print(scptools(url="scp://21.12.2.196//tmp/gjj20200402.log"))
186 # print(scptools(url="scp://[email protected]//tmp/"))
187 # print(curlcmd(data="",url="scp://21.12.2.196//tmp/gjj20200402.log"))
188 # print(curlcmd(data="",url="scp://[email protected]/tmp/",op="upload",filename="test111.txt"))

原文地址:https://www.cnblogs.com/silencemaker/p/12630679.html

时间: 2024-10-07 19:31:52

pycurl之公共方法--请求/上传/下载,解析json的相关文章

asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文

近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的是windows 平台下的版本,是很好用的,下面附上说明及CURL下载地址在asp.net中,可以调用cmd命令行,运行这个脚本,实现上传下载的功能,但我需要讲的重点不在此,做为一个在线运行的项目,允许网站目录下可以运行.exe的程序是非常不安全的,所以接下来的DEMO是采用asp.net(c#)的

C#MVC通过AJAX调用API方法进行上传下载

//这是写的一个类,具体是上传图片的上传和下载 public class FileResult    {        public int Code { get; set; }        public string Msg { get; set; }        public string Url { get; set; }    } //首先在api方法内新建一个控制器 //控制器内写关于上传和下载的具体代码 // 允许上传的文件扩展名        public string[] E

.NET两种常见上传下载文件方法

1.FTP模式 代码如下: (1)浏览 /// <summary> /// 浏览文件 /// </summary> /// <param name="tbControl">控件名称</param> private void ViewFile(TextBox tbControl) { OpenFileDialog openFileDialogTemp = new OpenFileDialog();//提示用户打开文件弹窗 //设置文件类型

C#实现http协议支持上传下载文件的GET、POST请求

C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Collections; using System.IO; using System.Text.RegularExpressions; using RE = System.Text.Regula

向云服务器上传下载文件方法汇总(转)

转载于:https://yq.aliyun.com/articles/64700 摘要: 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌面的时候,点"选项>>" 2."本地资源"-->详细信息. 3."磁盘驱动器"前面打钩. 一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌

java实现上传下载积分方法

原文:java实现上传下载积分方法 代码下载:http://www.zuidaima.com/share/1550463242472448.htm 类似牛币的加减分数的方法,上传加分,下载减分,下载一样的不加不减. java实现上传下载积分方法

经验分享] 向云服务器上传下载文件方法汇总

一.向Windows服务器上传下载文件方式 方法有很多种,此处介绍远程桌面的本地资源共享方法. 1.运行mstsc,连接远程桌面的时候,点"选项>>" <ignore_js_op> 2."本地资源"-->详细信息. <ignore_js_op> 3."磁盘驱动器"前面打钩. <ignore_js_op> 4.连接远程电脑后,打开"我的电脑",就能看到刚刚共享的硬盘驱动器.把

SecureCRT上传下载数据的方法

转自http://blog.sina.com.cn/s/blog_4af3b94f0101kfw5.html ———————————————————————————————————————————————————— SecureCRT这款SSH客户端软件同时具备了终端仿真器和文件传输功能.比ftp命令方便多了,而且服务器不用再开FTP服务了.rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. windows端需要支持ZModem的telnet/ssh客户端

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程: 首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯. NameNode与各DataNode使用心跳机制来获取DataNode信息.NameNode收到Client请求后,