在python3中你是如何处理字符串的?也许有你用的到的(三)
2018-11-18 本文已影响87人
运维开发_西瓜甜
字符串(三)
字符串中使用变量
你一定会想到 %
和 字符串的 format()
方法
In [1]: "Hello my name is %(name)s}" % {'name': 'shark'}
Out[1]: 'Hello my name is shark}'
In [2]: "Hello my name is {name}".format(name='xiguatian')
Out[2]: 'Hello my name is xiguatian'
当程序中已经存在被赋值过的变量,可以使用 formt_map()
和 内置函数 vars()
结合使用。
比如:
In [3]: name='shark'
In [4]: age = 18
In [5]: "用户信息:姓名: {name} 年龄: {age}".format_map(vars())
Out[5]: '用户信息:姓名: shark 年龄: 18'
vars()
内置函数还可以用于一个类的实例
class UserInfo:
def __init__(self, name, age):
self.name = name
self.age = age
user = UserInfo('xiguatian', 19)
s = "用户信息:姓名: {name} 年龄: {age}"
user_info = s.format_map(vars(user))
输出结果:
print(user_info)
用户信息:姓名: xiguatian 年龄: 19
但是, format()
和 format_map()
都不能很好的处理确实变量的问题,比如:
In [10]: "用户信息:姓名: {name} 年龄: {age}".format(name='sha
...: rk')
--------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-10-a6f17429a578> in <module>()
----> 1 "用户信息:姓名: {name} 年龄: {age}".format(name='shark')
KeyError: 'age'
所以我们需要写一个类来把 vars()
包装一下, 这里就需要用到特殊函数 __missing__()
, 这个方法可以在一个字典中的 key
缺失是返回一个值,这样可以保证程序不会因为确实变量(key
)而抛出异常。
具体做法:
class SafeSub(dict): # 继承 dict
"""防止 key 缺失"""
def __missing__(self, key):
return "{%s}" % key
class UserInfo:
def __init__(self, name):
self.name = name
user = UserInfo('xiguatian')
s = "用户信息:姓名: {name} 年龄: {age}"
user_info = s.format_map(SafeSub(vars(user)))
输出内容:
print(user_info)
用户信息:姓名: xiguatian 年龄: {age}
可以看出当有缺失的 key
时, 它会出现在结果中,这显然对调试是很有帮助的,而不是出现一个异常。
如果你发现自己在代码中频繁的执行这些步骤,你可以将变量替换步骤用一个工 具函数封装起来。就像下面这样:
import sys
def sub(text):
return text.format_map(SafeSub(sys._getframe(1).f_locals))
只要这样使用
name = 'xiguatian'
print(sub("{name}{other}"))
xiguatian{other} # 打印出来的内容
以指定列宽格式化字符串
假如你有一些长字符串,想以指定的列宽将它们重新格式化。
textwrap
模块可以满足你
有如下字符串:
say = """曾经流行过这么一段话:
你可以和那个生病时替你着急,心疼你挤公交,嘱咐你多喝热水,提醒你雨天带伞的人谈恋爱。
但你一定要和那个心疼你挤公交,开车接送你上下班;下厨给你做好吃的;生病的时候喂你吃药,陪在你身边;阴雨天为你送伞的男人结婚。
"""
没有指定列宽的输出结果:
image.png指定列宽后的结果:
image.png首行缩进
image.png最多显示几行
image.pngtextwrap.fill()
的更多参数
def __init__(self,
width=70,
initial_indent="",
subsequent_indent="",
expand_tabs=True,
replace_whitespace=True,
fix_sentence_endings=False,
break_long_words=True,
drop_whitespace=True,
break_on_hyphens=True,
tabsize=8,
*,
max_lines=None,
placeholder=' [...]'):
结合你的终端大小进行输出
>>> import os
# 获取终端大小,记得只可以在终端中使用
>>> col = os.get_terminal_size().columns
>>> print(textwrap.fill(say, col)) # 要使用 print 函数
更多,官方文档奉上
textwrap.TextWrapper 官方文档
字符串的常用操作已完结