import subprocess# 如果外部命令返回值非0 , 则抛出subprocess.CalledProcessError异常result = subprocess.check_output(['cmd', 'arg1', 'arg2']).decode('utf-8')# 同时收集标准输出和标准错误result = subprocess.check_output(['cmd', 'arg1', 'arg2'], stderr=subprocess.STDOUT).decode('utf-8')# 执行shell命令(管道、重定向等) , 可以使用shlex.quote()将参数双引号引起来result = subprocess.check_output('grep python | wc > out', shell=True).decode('utf-8')2.12 不重复造轮子不要重复造轮子 , Python称为batteries included即是指Python提供了许多常见问题的解决方案 。
3. 常用工具3.1 读写 CSV 文件import csv# 无header的读写with open(name, 'rt', encoding='utf-8', newline='') as f:# newline=''让Python不将换行统一处理for row in csv.reader(f):print(row[0], row[1])# CSV读到的数据都是str类型with open(name, mode='wt') as f:f_csv = csv.writer(f)f_csv.writerow(['symbol', 'change'])# 有header的读写with open(name, mode='rt', newline='') as f:for row in csv.DictReader(f):print(row['symbol'], row['change'])with open(name, mode='wt') as f:header = ['symbol', 'change']f_csv = csv.DictWriter(f, header)f_csv.writeheader()f_csv.writerow({ 'symbol': xx, 'change': xx})注意 , 当 CSV 文件过大时会报错:_csv.Error: field larger than field limit (131072) , 通过修改上限解决
import syscsv.field_size_limit(sys.maxsize)csv 还可以读以 t 分割的数据
f = csv.reader(f, delimiter='t')3.2 迭代器工具itertools 中定义了很多迭代器工具 , 例如子序列工具:
import itertoolsitertools.islice(iterable, start=None, stop, step=None)# islice('ABCDEF', 2, None) -> C, D, E, Fitertools.filterfalse(predicate, iterable)# 过滤掉predicate为False的元素# filterfalse(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6itertools.takewhile(predicate, iterable)# 当predicate为False时停止迭代# takewhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 1, 4itertools.dropwhile(predicate, iterable)# 当predicate为False时开始迭代# dropwhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6, 4, 1itertools.compress(iterable, selectors)# 根据selectors每个元素是True或False进行选择# compress('ABCDEF', [1, 0, 1, 0, 1, 1]) -> A, C, E, F序列排序:
sorted(iterable, key=None, reverse=False)itertools.groupby(iterable, key=None)# 按值分组 , iterable需要先被排序# groupby(sorted([1, 4, 6, 4, 1])) -> (1, iter1), (4, iter4), (6, iter6)itertools.permutations(iterable, r=None)# 排列 , 返回值是Tuple# permutations('ABCD', 2) -> AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DCitertools.combinations(iterable, r=None)# 组合 , 返回值是Tupleitertools.combinations_with_replacement(...)# combinations('ABCD', 2) -> AB, AC, AD, BC, BD, CD多个序列合并:
itertools.chain(*iterables)# 多个序列直接拼接# chain('ABC', 'DEF') -> A, B, C, D, E, Fimport heapqheapq.merge(*iterables, key=None, reverse=False)# 多个序列按顺序拼接# merge('ABF', 'CDE') -> A, B, C, D, E, Fzip(*iterables)# 当最短的序列耗尽时停止 , 结果只能被消耗一次itertools.zip_longest(*iterables, fillvalue=https://www.isolves.com/it/cxkf/yy/Python/2022-01-04/None)# 当最长的序列耗尽时停止 , 结果只能被消耗一次3.3 计数器计数器可以统计一个可迭代对象中每个元素出现的次数 。
import collections# 创建collections.Counter(iterable)# 频次collections.Counter[key]# key出现频次# 返回n个出现频次最高的元素和其对应出现频次 , 如果n为None , 返回所有元素collections.Counter.most_common(n=None)# 插入/更新collections.Counter.update(iterable)counter1 + counter2; counter1 - counter2# counter加减# 检查两个字符串的组成元素是否相同collections.Counter(list1) == collections.Counter(list2)3.4 带默认值的 Dict当访问不存在的 Key 时 , defaultdict 会将其设置为某个默认值 。
import collectionscollections.defaultdict(type)# 当第一次访问dict[key]时 , 会无参数调用type , 给dict[key]提供一个初始值3.5 有序 Dictimport collectionscollections.OrderedDict(items=None)# 迭代时保留原始插入顺序4. 高性能编程和调试4.1 输出错误和警告信息向标准错误输出信息
import syssys.stderr.write('')输出警告信息
import warningswarnings.warn(message, category=UserWarning)# category的取值有DeprecationWarning, SyntaxWarning, RuntimeWarning, ResourceWarning, FutureWarning
推荐阅读
- Go 语言 channel 的阻塞问题
- 风牌功夫红茶,功夫红茶历史
- 贾森·理查德森|盘点NBA5大理查德森
- 活页本介绍及选购技巧
- 综合橱柜品牌推荐十大排名
- 印度立普登红茶,印度大吉岭红茶的历史
- 天心茗茶大叶功夫红茶,功夫红茶历史
- 十年红茶,红茶的发展历史和状况
- 茉莉红茶历史,茉莉红茶功效与作用
- 6寸的蛋糕多大?
