Python基础:修订间差异

来自牛奶河Wiki
跳到导航 跳到搜索
无编辑摘要
 
(未显示同一用户的1个中间版本)
第232行: 第232行:


=== Tips ===
=== Tips ===
 
==== 迭代 ====
 


=== Error ===
=== Error ===
第243行: 第242行:
  # pip install pyOpenSSL
  # pip install pyOpenSSL
  apt install python3-openssl
  apt install python3-openssl
## https://askubuntu.com/a/1433089/497392
# apt remove python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
pip3 install pyopenssl --upgrade


==== 迭代 ====
[[分类:Develop]]
[[分类:Develop]]
[[分类:Python]]
[[分类:Python]]

2024年7月29日 (一) 16:08的最新版本

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

Base

Install

# pip upgrade
python3 -m pip install --upgrade pip

已安装包

  • pip3 list
  • Pip3 install numpy…whl
reload
import importlib
importlib.reload(usql_sys)

sys

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

ENV

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

Dev

指定编码

变量中出现非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
  • 指定目录
sys.path.append("/usr/include/udefpy3")
import ustr
# ustr 为 udefpy3 下文件

建目录(多级,相当于 -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'

三目

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]))

文件

open() 是内置函数,它会返回一个文件对象,这个文件对象拥有 read、readline、readlines、write、close 等方法。

open(filename, 'mode')
  • r:表示文件只能读取
  • w:表示文件只能写入
  • a:表示打开文件,在原有内容的基础上追加内容,在末尾写入
  • w+:表示可以对文件进行读写双重操作

以上为读 txt 格式,若读二进制格式,则加上 b,如:rb

方法 均可指定读入字符数

  • read()

读为字符串(在文本模式下)或字节对象(在二进制模式下)

  • readline()

读取整行

  • readlines()

读取所有行,返回列表

  • write(str)

写入字符串

变量类型

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(',')
字符串方法

str.upper()

str.lower()

str.capitalize()

首个字母大写,其余小写

str.casefold()

消除大小写类似于转为小写,但是更加彻底一些,因为它会移除字符串中的所有大小写变化形式。 例如,德语小写字母 'ß' 相当于 "ss"。 由于它已经是小写了,lower() 不会对 'ß' 做任何改变;而 casefold() 则会将其转换为 "ss"

str.center(width[, fillchar])

返回长度为 width 的字符串,原字符串在其正中。 使用指定的 fillchar 填充两边的空位(默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本

str.count(sub[, start[, end]])

返回子字符串 sub 在 [start, end] 范围内非重叠出现的次数。 可选参数 start 与 end 会被解读为切片表示法。

If sub is empty, returns the number of empty strings between characters which is the length of the string plus one

list

v1 = ['abc', ' ', 'aa', ';', 'bb', ',', 'cc', ' ', '|', 'dd(xx).xxx', ' ', "12.12'", ' ', 'xxxx']
  • 添加/删除元素
v1.append('Apple') 
del v1[0]
del_last = v1.pop(-1)    # 删除最后一个值
v1.remove('a')           # 删除第一个匹配值,若找不到报错
  • 列表截取,list[parm1:parm2:parm3]
  1. parm1:开始下标,可以为空,默认为0
  2. parm2:结束下标,可以为空,默认为 list.size,但是不包括 list.size,左闭右开
  3. param3:步长,默认为1
  • 截取
    • v1[1] # 第二个元素
    • v1[-2] # 倒数第二个元素
    • v1[::-1] # 逆序列表
    • v1[:-1]   # 除了最后一个,取全部
    • v1[2::-1] # 从第三个元素开始到结束的逆序
  • 合并
v2 = ['add1', 'add2', 123]
v1 = [*v1, *v2]

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"]
>>> re.split(r'[,; ] *', v1)
['abc', 'aa', 'bb', 'cc', , 'dd(xx).xxx', "12.12'", 'xxxx']
>>> re.split(r'(,|;| |\|) *', v1)   # 带分隔符
['abc', ' ', 'aa', ';', 'bb', ',', 'cc', ' ', , '|', 'dd(xx).xxx', ' ', "12.12'", ' ', 'xxxx']
>>> 可以使用 [::2] 去掉分隔符
与 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.')

Tips

迭代

Error

  • (pip)AttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK'

python/pip 和 pyOpenSSL 版本不对应

apt remove python3-openssl -y
apt autoremove -y

# pip install pyOpenSSL
apt install python3-openssl

## https://askubuntu.com/a/1433089/497392
# apt remove python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
pip3 install pyopenssl --upgrade