1 运行python脚本传参
1.1 指定参数名传参
python xx/xx.py -t $a -s $b -k $c
实际使用:
usage = "usage: %prog -t token -s secret -k key"
parser = OptionParser(usage)
parser.add_option("-t", "--token", dest="token", help="Token")
parser.add_option("-s", "--secret", dest="secret", help="Secret")
parser.add_option("-k", "--key", dest="key", help="Key")
options, args = parser.parse_args()
if options.token is None:
parser.error("token is not set.")
if options.secret is None:
parser.error("secret is not set.")
if options.key is None:
parser.error("key is not set.")
1.2 据参数位置传参
python xx/xx.py /xx/xx /xx/xx xx xx
if len(sys.argv) < 5:
usage()
exit(1)
data_dir1 = sys.argv[1]
data_dir2 = sys.argv[2]
data_name = sys.argv[3]
api_type = sys.argv[4]
2 文件目录操作(import os)
2.1 目录基本增删
实际使用:
import os
if not os.path.exists(data_dir):
os.makedirs(data_dir) #创建路径
else:
shutil.rmtree(data_dir) #清除路径
os.makedirs(nlp_data_dir)
2.2 目录拼接
import os
Path1 = 'Python'
Path2 = 'Java'
Path3 = 'C++'
Path10 = Path1 + Path2 + Path3
Path20 = os.path.join(Path1, Path2, Path3)
print('Path1 = ', Path10) # 返回 PythonJavaC++
print('Path1 = ', Path20) # 返回 Python\Java\C++
路径含有 \ 或 / 的区别:
2.3 路径拆分
os.path.basename(Path20) #返回文件名
os.path.dirname(Path20) #返回目录路径
os.path.split(Path20) #切分文件名和路径
实际使用:
output_path = os.path.join(target_data_dir, os.path.basename(source_file))
3 流程控制:if
实际使用:
if a== "text":
print("text类型")
elif api_type == "sql":
print("sql类型")
else:
print("不支持类型")
4 函数定义及调用
定义: def get_data(source_file): print("开始处理" + source_file) return num
调用1:
fun = get_data
调用2:
fun =get_data(source_file)
5 操作文件 open()函数详解
open() 函数用于创建或打开指定文件,语法格式:
file = open(file_name , mode='r' , buffering=-1 , encoding = 'utf-8')
file:表示要创建的文件对象。
file_name:要创建或打开文件的文件名称(最好绝对路径)
mode:可选,用于指定文件的打开模式。如果不写,则默认以只读(r)模式打开文件。
可选模式:
r:只读(文件必须存在); w:只写 (若文件存在,会覆盖文件;反之,则创建新文件)
a:以追加模式打开一个文件(存在,追加;不存在,创建)
buffering:可选,用于指定对文件做读写操作时,是否使用缓冲区。
encoding:手动设定所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)
参考链接:Python open()函数详解:打开指定文件 (biancheng.net)
实际使用:
方式1:
定义一个open的方法
def open_flat(output_path_flie, mode): try: out = open(output_path_flie, mode, encoding='utf-8') return out except Exception as e: raise e
调用:
fileObj= open_flat(output_path_flie, 'w') #创建操作文件对象 txt='xxxxx' fileObj.write('\007'.join(txt) + "\n") #写出 '\007'.join, 每个元素间用\007连接 output.flush() output.close() #关闭 解析 '\007'.join : # 连接多个字符串 strs = ['a', 'b', 'c', 'd'] # 要连接的字符串数组 sep = '\007' # 字符串之间的分隔符 s = sep.join(strs) # 连接 print s # 输出 a\x07b\x07c\x07d
方式2: txt='xxxxx' with open(output_path_flie, 'w') as csv_write:#创建操作文件对象 自带关闭csv_write.write('\007'.join(txt).encode('utf-8')+'\n') #写出 读取模式: with open(source_file, 'r', encoding='utf-8') as f: for lines in f.readlines(): line = lines.strip().split(' ') id = line[0] content = line[1]
使用with语句,文件会在with代码块结束后自动关闭
两种方式区别,参考链接:
(6条消息) python 使用 with open() as 读写文件_xrinosvip的博客-CSDN博客
6 多线程 线程池 ThreadPoolExecutor
该模块通过 submit 返回的是一个 future 对象
解析参考链接:
python线程池 ThreadPoolExecutor 的用法及实战 - 简书 (jianshu.com)
实际使用:
定义一个函数run,传递需要运行函数current_fun(主处理逻辑)
from concurrent.futures import ThreadPoolExecutor, as_completed def run(current_fun): files = [] for file_name in os.listdir(source_data_dir): if not file_name.startswith("."): files.append(file_name) if not files: print("{}是空目录".format(source_data_dir)) return executor = ThreadPoolExecutor(max_workers=int(thread_num)) all_task = [executor.submit(current_fun, os.path.join(source_data_dir, file_name)) for file_name in files] all_nums = 0 for future in as_completed(all_task): # 当某一个future任务执行完毕后,执行下面代码。会阻塞,等待线程完成后执行 num = future.result() # 获取线程的返回结果 all_nums += num print("总共处理行数:{}".format(all_nums))
解析:[executor.submit(current_fun, os.path.join(source_data_dir, file_name)) for file_name in files]
os.path.join(path,file_name) 拼接文件的绝对路径
executor.submit(current_fun,parms)线程提交任务:
current_fun主逻辑处理函数,parms是需要传入current_fun函数的入参(即已拼接完的文件路径)
file_name+2 for file_name in files 推导式,将循环出的结果再逻辑加工,如例子为+2
[(1,2.3)] 将集合结果转成列表
as_completed(all_task) 获取任务执行后对象,具体参照链接:
(6条消息) Python concurrent.futures 的 as_completed 函数解释_潘广宇的学习日记-CSDN博客_concurrent.futures.as_completed
调用:run(fun)
7 异常抓取 try/catch
主要语法:
try:
print('需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序')
except: #捕捉异常,并根据异常抛出异常处理信息
print('这里执行异常处理的相关代码,打印输出等')
else: #如果没有异常则执行else
print('try部分被正常执行后执行的代码')
finally:
print('退出try语句块总会执行的程序')
实际使用:
场景1:
def attempt_float(x): try: return float(x) except: return x #错误已抓取,不再报错 attempt_float('1.2345') attempt_float('something')
场景2:可指定报错的类型,处理
def attempt_float(x): try: return float(x) except (TypeError, ValueError): return x 场景3:无论是否报错,最后均执行关闭 f = open(path, 'w') try: write_to_file(f) except: print('Failed') else: print('Succeeded') finally: f.close()
8 关于url的操作
8.1拼接url
urllib.parse.urlencode(parms) # 将key-value转化为url的形式
import urllib.parse
url = 'http://www.baidu.com/s'
query = {
'wd': 'Python',
'ie': 'UTF-8'
}
print(url + '?' + urllib.parse.urlencode(query))
8.2 url的unicode加解密
urllib.parse.quote('测试') 返回 '%E6%B5%8B%E8%AF%95'
urllib.parse.unquote('%E6%B5%8B%E8%AF%95') 返回 '测试'
8.3 url的访问
访问:requests.get(url, param)
实际使用: reponse = requests.get(url, param) if reponse.status_code != 200: print("请求[content:{},url:{},data:{}] 失败".format(content, url, param)) print(reponse.content) time.sleep(30) continue else: data = json.loads(reponse.content)['Data']) #加载json数据,并用['key'],取出对应数据 words = [words['word'] for words in data] #推导式,循环取出json格式的data中的['word']
9 程序基本逻辑设计
9.1 重试设置
实际使用:
retries = 31 sleep_time= 30 for i in range(retries): reponse = requests.get(url, param) if reponse.status_code != 200: time.sleep(sleep_time) continue else: return json.loads(reponse.content) except Exception as e: print("请求[content:{},url:{},data:{}] 出现异常".format(content, url, param)) print(e.message) print(reponse.content) time.sleep(sleep_time) continue print("[content:{},请求url:{},data:{}]已达最大次数".format(content, url, param)) return None
9.2 错误几次后异常退出
实际使用:
def maxErrorExit(errorFrequency): if errorFrequency > maxError: print('访问api接口错误率已超最大值{},请相关人员介入排查原因。'.format(maxError)) exit(1)
9.3 程序处理时间
实际使用:
def duration(): end = time.time() return int(end - start) if __name__ == "__main__": start = time.time() print("{}生成完成,总用时{}秒".format(xx, duration()))
9.4 传参格式提醒
实际使用:
def usage(): print("usage: parameters: data,dir,name,type") if __name__ == "__main__": if len(sys.argv) < 4: usage() exit(1)
本篇知识点参考《利用python进行数据分析》,更多知识请阅读原书