(8)python 实战详情 常用模块和函数

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进行数据分析》,更多知识请阅读原书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值