本文共 4234 字,大约阅读时间需要 14 分钟。
在程序运行过程中,我们有时需要将数据对象的内容保存下来,以便下次程序启动时读取。这种操作称为对象持久化。以下是使用 pickle 库进行数据持久化的示例:
import pickle# 创建测试字典before_d = {}before_d[1] = "Name 1"before_d[2] = "Name 2"before_d[3] = "Name 3"# 将字典持久化到文件with open("dict1.dat", "w") as fout: pickle.dump(before_d, fout, protocol=0)fout.close()# 恢复字典with open("dict1.dat", "r") as fin: after_d = pickle.load(fin)fin.close()# 输出结果print(before_d) # {1: 'Name 1', 2: 'Name 2', 3: 'Name 3'}print(after_d) # {1: 'Name 1', 2: 'Name 2', 3: 'Name 3'} 目标是将字符串 line 中的 overview.gif 替换为其他字符串。以下是实现方法:
import reline = ''# 创建匹配 SRC="..." 的正则表达式mo = re.compile(r'(?<=SRC=)"([\w+\.]+)"', re.I)# 替换匹配到的内容new_line = mo.sub(r'"\1****"', line)print(new_line) #
# 替换为自定义字符串new_line = mo.sub(r'replace_str_\1', line)print(new_line) #
# 可根据需要替换其他内容new_line = mo.sub(r'testetstset', line)print(new_line) #
有时我们需要遍历特定目录中的文件,可以使用 os.walk 方法:
import osfileList = []rootdir = "/tmp"for root, subFolders, files in os.walk(rootdir): if '.svn' in subFolders: subFolders.remove('.svn') for file in files: if ".t2t" not in file: file_dir_path = os.path.join(root, file) fileList.append(file_dir_path)print(fileList) 如果列表中的每个元素都是元组,可以根据指定列排序。以下示例根据元组的第 2 和第 3 列数据进行排序:
a = [ ('2011-03-17', '2.26', 6429600, '0.0'), ('2011-03-16', '2.26', 12036900, '-3.0'), ('2011-03-15', '2.33', 15615500, '-19.1')]# 按第 2 列排序并倒序b = sorted(a, key=lambda x: x[1], reverse=True)print(b)# 按第 3 列排序并倒序c = sorted(a, key=lambda x: x[2], reverse=True)print(c) 有时需要删除列表中的重复元素,可以使用 set 函数:
lst = [(1, 'sss'), (2, 'fsdf'), (1, 'sss'), (3, 'fd')]unique_lst = set(lst)print(unique_lst) # {1: 'sss', 2: 'fsdf', 3: 'fd'}# 去重后的列表unique_lst = list(set(lst))print(unique_lst) # [1, 'sss', 2, 'fsdf', 3, 'fd'] 通常我们根据字典的 key 进行排序,但若需要根据 value 排序,可以使用 itemgetter 函数:
from operator import itemgetteraa = { 'a': '1', 'sss': '2', 'ffdf': '5', 'ffff2': '3'}# 按 value 进行排序sort_aa = sorted(aa.items(), key=itemgetter(1))print(sort_aa) # [('a', '1'), ('sss', '2'), ('ffff2', '3'), ('ffdf', '5')] 以下是将数据库连接字符串从字典转换为字符串的示例:
params = { 'server': 'mpilgrim', 'database': 'master', 'uid': 'sa', 'pwd': 'secret'}# 转换为查询字符串query_params = ";".join(["%s=%s" % (k, v) for k, v in params.items()])print(query_params) # "server=mpilgrim;uid=sa;database=master;pwd=secret"# 将字符串转回字典a = "server=mpilgrim;uid=sa;database=master;pwd=secret"aa = {}for i in a.split(';'): key, value = i.split('=', 1) aa[key] = valueprint(aa) # {'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 'pwd': 'secret'} 将时间对象转换为字符串:
import datetimedatetime.datetime.now().strftime("%Y-%m-%d %H:%M")# 输出: '2011-01-20 14:05'# 时间大小比较import timet1 = time.strptime('2011-01-20 14:05', "%Y-%m-%d %H:%M")t2 = time.strptime('2011-01-20 16:05', "%Y-%m-%d %H:%M")print(t1 > t2) # Falseprint(t1 < t2) # True# 计算8小时前的时间time_now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")print(time_now) # '2011-01-20 14:05'eight_hours_ago = (datetime.datetime.now() - datetime.timedelta(hours=8)).strftime("%Y-%m-%d %H:%M")print(eight_hours_ago) # '2011-01-20 07:03'# 将字符串转换为时间对象endtime = datetime.datetime.strptime('20100701', "%Y%m%d")print(type(endtime)) # print(endtime) # '2010-07-01 00:00:00' 在编写日运维脚本时,常用 getopt 模块解析命令行参数。以下是一个示例:
#!/usr/bin/env python# coding: utf-8import sys, os, getoptdef usage(): print('''Usage: analyse_stock.py [options...]''')print("Options:")try: opts, args = getopt.getopt(sys.argv[1:], 'he:c:f:d:n:s:')except getopt.GetoptError: usage() sys.exit()if not opts: usage() sys.exit()for opt, arg in opts: if opt in ('-h', '--help'): usage() sys.exit()elif opt == '-d': print(f"del stock {arg}")elif opt == '-f': print(f"read file {arg}")elif opt == '-c': print(f"user-defined {arg}")elif opt == '-e': print(f"Exchange Name {arg}")elif opt == '-s': print(f"Stock code {arg}")elif opt == '-n': print(f"Stock name {arg}")sys.exit() 截取字符串输出:
str = "abcdefg"print("%.3s" % str) # abc 按固定宽度输出:
str = "abcdefg"print("%10s" % str) # abcdefg 转换为不同进制:
num = 10print("Hex = %x, Dec = %d, Oct = %o" % (num, num, num)) # Hex = a, Dec = 10, Oct = 12 转载地址:http://unofk.baihongyu.com/