Python基础

来自牛奶河Wiki
阿奔讨论 | 贡献2022年12月29日 (四) 15:44的版本
跳到导航 跳到搜索

Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。

Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。

像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。

官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。

Python 2.7 被确定为最后一个 Python 2.x 版本。

本文档包括:基本语法、string、re

INFO

已安装包

  • pip3 list
  • Pip3 install numpy…whl
指定编码

变量中出现非ASCII字符,则需要指定处理之编码,如:utf-8

#coding=<encoding name> 
OR
#!/usr/bin/python3
#-*- coding: utf-8 -*-

引入路径

同目录或系统

import sys
import os
import ustr

当前文件下一级目录

import udef.ustr as ustr
# or from udef.ustr import to_num
## 当前文件同级目录
sys.path.append("..")
import udef.ustr as ustr

reload

import importlib importlib.reload(usql_sys)

建目录(多级,相当于 -p)

if not os.path.exists(path_op):
    os.makedirs(path_op)

判断文件是否存在

os.path.exists(FN)
- OR -
os.path.isfile(FN)
- OR -
os.access(FN, os.F_OK|R_OK|W_OK|X_OK)

当前路径

os.chdir('./ppy')
os.getcwd()

动态执行命令

TOPIC=b"l_serv_monitor_io"
CMD="mqkc.topics[TOPIC]"
mqtp = eval(CMD)

编译

DEBUG

python3 -m pdb mqlog_oc_mc3 n=10000 offset=0

b umq.py:353  设置断点
c 执行到下一个断点

l 列出附近代码

特殊字符

PA='\x04'

list

  1. 下标从零开始 - print(v1_list[0])
  2. length - print(len(v1_list))

三目

max = a if a>b else b

lamda 表达式

uncol = str([x for x in re.split(" *, *", uncol) if x]).strip('[]')
cols = re.sub('[\[\]\']', , str([x for x in re.split(" *, *", cols) if x]))

sys

sys.argv 是命令行参数列表,type=列表

ENV

os.environ['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8' #oracle

string

split
# 将字符串按分隔符切几次,切分的最后部分为剩余全部;如:n=1时,字符串为两部分
v1 = "1010;msinfo;bidb01;10.10.137.10;/;32"
key,type,name,ip,v1 = v1.split(';', 4)
#也可以把拆分后的结果存到 list
v1_list = v1.split(';')
## strip
#移除字符串头尾指定的单字符,支持多个单字符。
str.strip([chars])
s=',hello, world.,!,'
s.strip(',.!')                # 'hello, world'
str(e).replace('\r', ' ').replace('\n', ' ') # delete \r\n
## 重复字符
v1 = "%s," * 10
## 子字符个数
s.count(',')

re

re.split
import re
v1="abc aa;bb,cc | dd(xx).xxx 12.12' xxxx"
>>> re.split(r' ', v1)
['abc', 'aa;bb,cc', , '|', 'dd(xx).xxx', "12.12'\txxxx"]
>>> re.split(r'[\s]', v1) 
['abc', 'aa;bb,cc', , '|', 'dd(xx).xxx', "12.12'", 'xxxx']
>>> re.split(r'[\s;,.()]', v1)
['abc', 'aa', 'bb', 'cc', , '|', 'dd', 'xx', , 'xxx', '12', "12'", 'xxxx']
>>> re.split(r'bb,', v1)
['abc aa;', "cc | dd(xx).xxx 12.12'\txxxx"]
与 str.split 比较,相同部分
s1='a,b,c,d, ,,12.3'
>>> re.split(',', s1)
['a', 'b', 'c', 'd', ' ', , '12.3']
>>> s1.split(',')
['a', 'b', 'c', 'd', ' ', , '12.3']
>>> s1.split('c,') 
['a,b,', 'd, ,,12.3']
# string 可以指定分解的个数
>>> s1.split(',',3)
['a', 'b', 'c', 'd, ,,12.3']
正则
s2='a,{b,c,d}, ,,12.3'
>>> re.split('{|}', s2)  
['a,', 'b,c,d', ', ,,12.3']
>>> re.split('{|}|,', s2)
['a', , 'b', 'c', 'd', , ' ', , '12.3']
re.sub 替换
. = any char
* = more
re.sub(' ', , p_str1)
str1 = 'a, b , c ,d e, f1,g'
re.sub(' *, *', ',', str1)

s="select a,b,c,eee from tab where sfrom = 'abc'"
re.sub('select.*?from', , s)  
# " tab where sfrom = 'abc'"

# 惰性匹配
#*,+,?等都是贪婪匹配,后面加?号使其变成惰性匹配
cols = re.sub(':.*?,', ',', s1+',').strip(',') # s1=uuid:1|32|h,etl_id:2|8|r,...
# 分组匹配
import re
s = '110223199001011123'
res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})(?P<bron_month>\d{2}',s)
print(res.groupdict())
此分组取出结果为:
{'province': '110', 'city': '223', 'born_year': '1990', 'bron_month': '01'}
# 取{}字符
re.search('\{.*\}', S1)

# 替换超过五个数字
re.sub('(\d\d\d\d\d*)', '32000',  str1)    # str1 = 'varchar2(65536)'
Error Info
# except Exception as e:
str(e).split('\n')[0]
# raise
raise ValueError('Error.')