python格式化字符串与输出对齐

来源:转载

当我们在对数据进行分析的时候通常会在excel中创建一个表格,表格的开始是一行属性,然后下面每一行的每一列都是和属性相关的内容,如图所示,





但是用excel需要手动一个一个输入,作为工程师,当然是要偷懒的,虽然可以使用第三方库操作excel的方式,但是太麻烦,能不能直接在文本文件中写入同样达到上述效果呢?如果不用excel直接在文本中进行写入虽然也能保存数据,但是会存在一个对齐的问题,每一行的数据虽然是对的,但是如果每一行的每一列没对齐,一方面不够美观,另一方面也不利于分析数据。本节就是为了解决这个问题,实现在文本文件中达到excel中每一列自动对齐效果。其中涉及到的知识点就是字符串的格式化与固定宽度的对齐。


格式化字符串
格式化操作符%

在c语言中格式化操作符是%,如我们经常通过如下语句格式化一个字符串输出


printf("my name is %s,now my age is %d","NetEase",20);

在python中格式化操作符也是%,因此上述代码转为python就是这样的:


print "my name is %s,now my age is %d" % ("NetEase", 20)


其中%s表示为一个字符串,%d表示为一个整数,这和C语言中是一样的。关于python中格式化操作符更多详细的介绍大家可以参看这个
https://www.cnblogs.com/vamei/archive/2013/03/12/2954938.html


不过在python中除了格式化操作符%来格式化字符串外,python还提供了一个format函数用来格式化字符串,而且功能更为强大,因此不推荐大家使用%这种方式


字符串格式化函数str.format()

format函数通过在字符串中的{}内指定要格式化的操作,用的比较多的是两种操作,一种是格式化替换字符串中的指定内容,一种是使用固定宽度对齐文本。其中格式化操作替换字符串中的指定内容可以通过位置,名称,下标等方式进行格式化替换。还是以开头的例子来说明



通过位置替换:

print "my name is {0},now my age is {1}".format("NetEase", 20)
通过位置替换{}中指定的数字的位置和format中参数位置一一对应
通过名称替换

print "my name is {name},now my age is {age}".format(age=20, name="NetEase")
通过名称替换{}中的名称可以和format参数中的名称位置不对应,但是和名称是一一对应
通过下标替换

li = ['NetEase', 20]
print "my name is {0[0]},now my age is {0[1]}".format(li)
通过下标替换就是先把要替换的参数放到list中保存,然后通过list下标形式进行替换,其中{0[0]}表示format参数中的第0个位置参数list的第0个元素,{0[1]}表示format参数中的第0个位置参数list的1个元素,即先通过位置然后通过下标替换

另一个可能会用到的就是格式化时保留字符串的引号{!r}


print "my name is {!r},now my age is {age}".format("NetEase", age=20)

输出为 my name is ‘NetEase’,now my age is 20


使用固定宽度对齐文本

很多时候我们希望在每行输出的多列字符串的每一列能够保持某一个固定的宽度,如果字符串的宽度比这个宽度小,就用空格或其他字符填充以保持输出的美观性,同时还可以指定每一列左/右对齐/居中对齐,视觉上类似windows文件夹的效果:





format函数就可以让我们输出的字符串达到这种每一列固定长度同时指定对齐方式的效果,使用方式为'{format_spec}’.format(args),其中format_spec格式如下:





format_spec 格式为 [[fill]align][sign][#][0][width][,][.precision][type],其中fill,align,width这3个参数使用较多,fill表示填充字符,align表示对齐方式,width表示宽度,其余参数使用不是很频繁,因此简化下上述格式为[[fill]align][width],因此总的格式为{index:[[fill]align][width]}.format(args),其中index表示args参数的位置,fill参数可以是任意字符,align参数可以为<(左对齐),>(右对齐),^(居中),=(使用不多,不做介绍),下面看个示例:


print '{0: <22},{1: ^20},{2: >20},'.format("欢迎访问", "huqi.tk", "welocme to huqi.tk")

输出为:





我们来分析下这个格式化表达式,第一个{0: <22}中0表示format参数中的第0个参数,即”欢迎访问”,空格是填充字符,<表示左对齐,22表示宽度为22,不足22用填充字符空格填充。{1: ^20}中1表示format参数中的第1个参数,即”huqi.tk”,余下以此类推。



关于format函数更详细的介绍,大家可以参看官方文档:
https://docs.python.org/2/library/string.html?highlight=str%20format#string.Formatter.format



另外这篇博客讲解python字符串格式化也讲的不错,大家可以作为补充了解:
https://www.cnblogs.com/wilber2013/p/4641616.html


因为这种对齐需求还是挺常用的,因此python对字符串专门提供了用来实现类似功能的函数,即字符串的输出宽度对齐函数



字符串输出宽度对齐函数

python本身提供了字符串格式化对齐的函数,主要包括左对齐str.ljust,居中对齐str.center,右对齐str.rjust,这三个函数的参数及其意义如下:


str.ljust(width, [fillchar])
str.center(width, [fillchar])
str.rjust(width, [fillchar])

这三个函数的参数相同,意义也相同,width表示总的字节宽度,fillchar为可选参数,表示填充字符,如果不传递该参数,则默认使用空格填充。因此前面那个示例我们改为用对齐函数表示则如下所示:


print "欢迎访问".ljust(22) + "," + "huqi.tk".center(20) + "," + "welocme to huqi.tk".rjust(20)

其中加上逗号,是为了更直观的看到对齐的效果。输出与前面示例输出相同。



实例

再回过头来看看我们开始提到的那个应用场景,在文本文件中达到excel中对齐的效果,用上面提到的几个对齐函数可以很轻松的在文本文件中达到excel中每一列自动对齐的效果。如下是一个对爬取的apk统计apk相关信息保存到文本文件中的一个示例。为了简化程序,突出本节重点,爬取的apk信息直接放到了一个list中。实际中应该是通过爬虫从各大应用商店爬取来获取数据的。


def get_format_line(aligin_type, str_list, width_list):
line = ""
for str_item, width_item in zip(str_list, width_list):
if aligin_type == "L":
line += str_item.ljust(width_item)
elif aligin_type == "M":
line += str_item.center(width_item)
elif aligin_type == "R":
line += str_item.rjust(width_item)
return line


def main():
output_file_path = u"./爬取apk信息统计"
str_list = [['网易邮箱大师', '22.0MB', 'com.netease.mail'],
['五子棋OL', '9.29MB ', 'ab.gobang', ],
['酷狗铃声', '12.9MB', 'com.kugou.android.ringtone'],
['百度视频', '46.6MB', 'com.baidu.video'],
['钉钉', '52.8MB', 'com.alibaba.android.rimet']]
width_list = [30, 12, 10]
cache_list = []
for str_item in str_list:
line = get_format_line('L', list(reversed(str_item)), width_list) + '/n'
print line
cache_list.append(line)
with open(output_file_path, "a+") as writer:
writer.write(''.join(cache_list))


if __name__ == '__main__':
main()

运行上述示例程序输出结果如下:





可以看到输出结果每一列是左对齐的,比较美观,几乎和手动在excel中录入这些数据效果一样。



分享给朋友:
您可能感兴趣的文章:
随机阅读: