python3 运维开发

在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.png

textwrap.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 官方文档

字符串的常用操作已完结

上一篇 下一篇

猜你喜欢

热点阅读