精华内容
下载资源
问答
  • python有内置的字符串方法str.center(x),可以让字符串以i的长度输出并居中。 但是! 但是! 但是! 在计算字符串长度时候默认是ascii的长度,也就是一个字符长度为1。 这显然行不通,因为一个中文占据2长度...

    在做一个小的格式化输出的时候出现了问题:无论怎么排,汉字都无法很顺利地被居中,尤其是汉字和英文或者数字在一起时,更是一团糟。


    python有内置的字符串方法str.center(x),可以让字符串以i的长度输出并居中。

    但是!

    但是!

    但是!

    在计算字符串长度时候默认是ascii的长度,也就是一个字符长度为1。

    这显然行不通,因为一个中文占据2长度!中文符号亦然。

    所以你要是想让 x=‘居中juzhong’ 这个字符串居中,你用str.center(len(x))的时候,就不能达到目的,原因是 len(x)=9 而不是实际上的11,输出的结果那自然是相当糟糕的。于是我写了一个函数,可以读取正确的字符串长度:

    def lenCN(n):
        #遇到非英文,自动二倍长度。
        n=list(n)
        stl=0
        for x in n :
            if x in string.printable:
                stl +=1
            else :
                stl+=2
        return stl
    这样字符串的正确长度就可以读取了,但是这对于顺利进行居中排版还是不够的。正确的做法应该是:用这个函数读取某项所有单位的实际长度(比如‘姓名’),求出其中最大值,(比如‘爱新觉罗狗蛋’,为12),再加上为了美观考虑的一些空长度(随意,比如4)。然后让所有的姓名单位输出时用 print(x.center(12+4))即可。

    有的时候,这样的输出也依然无法做到居中(奇数偶数空格的问题)。

    这个时候,可以使用我写的这个小函数来完成。

    def merg(x,y):
        a=int((最大长度列表[项目名]-checkCN(当前项))/2)
        b=int(((最大长度列表[项目名]-checkCN(当前项))/2)
        if a+b != ((最大长度列表[项目名]-checkCN(当前项)))) :
            b+=1
    #防止出现奇数项的情况
        return(a,b,)
    def getmerg(x,y):
        y=' '*merg(x,y)[0]+y+' '*merg(x,y)[1]
        return y

    一定可以达到目的。
    展开全文
  • Python 去做就是几秒的问题。 我查了很多 CSDN ,还有百度 ,以及google 。很少有人讲 PIL 的文字居中对齐的办法。貌似 PIL 没有自带居中对齐的功能。所以就需要自己去计算一些数值来得到 近似居中 的方法。我...

    前言:

    大家好我是最渣的黑客(宋哈哈),今天在写一个小脚本,让文字写到图片中,一个两个标题就可以手工用adobe 的 photoshop 就能解决,但是很多,就显得那么无力,当然也可以用 ps 的 数据组功能 也可以解决问题,但是每次都要打开ps,就显得很麻烦。用Python 去做就是几秒的问题。

    在这里插入图片描述

    我查了很多 CSDN ,还有百度 ,以及google 。很少有人讲 PIL 的文字居中对齐的办法。貌似 PIL 没有自带居中对齐的功能。所以就需要自己去计算一些数值来得到 近似居中 的方法。我找到一篇,但是那边只是讲到了 英文 和中文 如何居中,但是我遇到的都是中文英文数字都有的字符串情况吧比如:Python基础编程教学第1集 ,这样的标题,既有英文又有数字,还有中文。
    下面我就讲下,我是如何把这种类型的字符串如何居中的。下面方法也适合全英文和全中文的。一起的

    全部代码如下:

    # encoding:utf-8
    import os
    from PIL import Image, ImageFont, ImageDraw  # 导入模块
    import re
    
    
    
    def generate_img():
        file = os.listdir('file_title') # 浏览本地文件标题
        for f in file:
            filename = str(f).replace('.txt', '')
            font_size = 40  # 设置字符串字号 为 40px
            font = ImageFont.truetype(r'C:\Windows\Fonts\微软雅黑\msyhbd.ttc',
                                      size=font_size)
            font1 = ImageFont.truetype(r'C:\Windows\Fonts\微软雅黑\msyh.ttc',
                                       size=45)
            W = 700
            H = 700
            im = Image.new("RGB", (W, H), "white") # 创建 700*700 的像素
            draw = ImageDraw.Draw(im)
            match1 = re.findall('[a-zA-Z0-9]+', filename)
            match2 = re.findall(u'[\u4e00-\u9fa5]', filename)
            en_number = "".join(match1)  # 英文和数字
            chinese_simplified = "".join(match2)  # 中文简体
            chinese_simplified_len = len(chinese_simplified)  # 计算有多少个中文简体字
    
            en_number_size = draw.textsize(en_number)[0] * 4.5  # 英文和数字长度,因为我设置的字体样式原因,会比默认的英文长度大4.5倍左右,如何计算通过PS 导入每张所得图片计算位置。
            chinese_simplified_size = font_size * chinese_simplified_len  # 中文长度,前提是背景也是 px 单位。设置一个中文字体为 40号字体等于 宽40p*高40px,在700px*700px所占面积。
            total_len = en_number_size + chinese_simplified_size  # 英文和中文和数字 全部长度
            draw.text(((700 - total_len) / 2, 100), filename, fill=(255, 0, 0), font=font)  # 利用ImageDraw的内置函数,在图片上写入文字
            print("请输入关于《%s》关键词:" % filename)
            for n in range(200,500,100):
                title1 = input("请输入第一个关键词:")
                title2 = input("请输入第一个关键词:")
                draw.text((145, n), title1, fill=(255, 0, 0), font=font1)  # 利用ImageDraw的内置函数,在图片上写入文字
                draw.text((400, n), title2, fill=(255, 0, 0), font=font1)  # 利用ImageDraw的内置函数,在图片上写入文字
    
    
            # im.show()
            im.save(r'D:\pro_py\taobao_aotu\baby_img\%s.jpg' % filename)
    
    if __name__ == '__main__':
        generate_img()
    

    1.【下方】代码解释:
    导入 PIL 和 re ,os 库,没有安装的需要pip 安装下,或者是 pycharm 设置里面去安装下。一般都是自带。

    # encoding:utf-8
    import os
    from PIL import Image, ImageFont, ImageDraw  # 导入模块
    import re
    
    

    2.【下方】代码解释:

    用os 库浏览本地文件,因为我这是全是 txt 文件,所有我直接就把它转成 str 然后替换掉了 “.txt” ,注意有个点。这里得到了文件名称。

    
    file = os.listdir('file_title')
    for f in file:
        filename = str(f).replace('.txt', '')
    

    得到文件名称如下:

    30天旅行英语
    AutoCAD2017机械设计教程
    Python核心编程翻译版
    Web安全之信息收集篇
    短视频剧本1700条脚本文案
    零基础学PHP全彩版
    黑客与逆向python之道
    

    3.【下方】代码解释:

    创建一个 700*700的白底图片,单位为px 。

    W = 700
    H = 700
    im = Image.new("RGB", (W, H), "white") # 创建 700*700 的像素
    draw = ImageDraw.Draw(im)
    

    4.【下方】代码解释:
    1)设置字体大小为:40px
    2)设置字体样式为:微软雅黑加粗
    3)match1 是 正则表达式筛选出 字符串的英文和数字
    4)match2 是 正则表达式筛选出 字符串的中文字体
    5)en_number 是将筛选出来的 英文和数字 list【列表 】转换成 字符串,方便计算长度
    6)en_number 是将筛选出来的 中文字体 list【列表 】转换成 字符串,方便计算长度

    font_size = 40  # 设置字符串字号 为 40px
    font = ImageFont.truetype(r'C:\Windows\Fonts\微软雅黑\msyhbd.ttc',size=font_size)
    match1 = re.findall('[a-zA-Z0-9]+', filename)
    match2 = re.findall(u'[\u4e00-\u9fa5]', filename)
    en_number = "".join(match1)  # 英文和数字
    chinese_simplified = "".join(match2)  # 中文简体
    

    5.【下方】代码解释【重要的来了】

    chinese_simplified_len = len(chinese_simplified)  # 计算有多少个中文简体字
    en_number_size = draw.textsize(en_number)[0] * 4.5  # 英文和数字长度,因为我设置的字体样式原因,会比默认的英文长度大4.5倍左右,如何计算通过PS 导入每张所得图片计算位置。
    chinese_simplified_size = font_size * chinese_simplified_len  # 中文长度,前提是背景也是 px 单位。设置一个中文字体为 40号字体等于 宽40p*高40px,在700px*700px所占面积。
    total_len = en_number_size + chinese_simplified_size  # 英文和中文和数字 全部长度
    
    

    代码思路【复制代码并不能解决问题,要了解思路】:

    因为我们想要我们的字符串,在图片中居中。就需要知道,总字符串的长度 为多少,计算 英文和数字的大小方法为:

    draw.textsize(en_number) # en_number 是 英文+数字的字符串,链接上述代码。别看不懂。
    

    因为我们只需要长度(宽),所以取元组的 第一位数值,得到真正的英文和数字的长度为:en_number_size

    en_number_size = draw.textsize(en_number)[0]
    

    得到了,英文和数字的长度后,我们需要得到中文字体的长度,而中文实际的长度计算就比较简单了,因为我们默认创建的是 700px * 700px ,而字体大小【font_size】是 40px 。那么就是字体 的宽高就是 40px*40px ,px:像素的意思。所以这里得到一个中文字体的宽为 40px ,代码如下。

    chinese_simplified_size = font_size * chinese_simplified_len
    

    其中 chinese_simplified_len 为 有多少个字符,上面可以通过 len 来计算有多少个中文字符,然后乘以 一个字符的宽 的长度,得到中文字符总长度为:chinese_simplified_size, 从而可以计算到 英文和中文的总长度为:total_len

    total_len = en_number_size + chinese_simplified_size  # 英文和中文和数字 全部长度
    

    由此然后利用简单的数学图形 公式计算下:得到居中的长度: (700 - total_len) / 2 ,得到了左右两边除去 字符串 总长度的长度。

    然后进行输入到代码中,以下代码为例:

    (700 - total_len) / 2 : 是居中位置
    filename : 是文件名称
    fill=(255, 0, 0) : 是字体颜色,
    font=font : 字体样式

    draw.text(((700 - total_len) / 2, 100), filename, fill=(255, 0, 0), font=font)
    im.save(r'D:\pro_py\taobao_aotu\baby_img\%s.jpg' % filename)
    

    总结:
    可能有人会疑虑,你的计算英文数字这个代码那不是 * 4.5 吗?为什么要 *4.5 ?

    en_number_size = draw.textsize(en_number)[0] * 4.5 
    

    因为我默认设置的字体是:微软雅黑加粗,会自动的把英文和数字的字体 放大到原来的约等于 4.5倍,所以乘以了 4.5。如何得到 4.5 倍这个数值的呢?
    我用的是 adobe AI 把每一次的不同长度 英文和数字的图片导入到了 adobe 的 ai 中进行了,手工的计算。
    下图 英文和数字的 字符 一共有 11 个按照 en_number_size = draw.textsize(en_number)[0] ,计算得到为:66 ,但加了 字体样式后总长度为实际长度为 288 ,288/66 ≈ 4.3。 我以此类推,将 字符数量 从 4 个 5个 6个 12个 这样计算,差不多取出中间值为 4.5 。也就是说加了字体样式后,字体会扩大 4.5 倍的长度。所以我再那里 * 4.5 。

    在这里插入图片描述
    **温馨提醒:**你所设置的 字体类型,字体样式 加粗 还是 加描边 等都会影响,居中的实际长度。建议您,其他代码保持不变,用手工计算出加样式后和不加的倍数,直接 换掉 4.5 就行。
    也有可能会有更好的居中方法,此方法仅供参考。如果对你有帮忙,帮忙点个关注呗。我会持续分享CSDN ,解决办法少,有很小众的问题。

    展开全文
  • 本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.4节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,...实现字符串对齐:左对齐,居中对齐,或者右对...

    本节书摘来自异步社区《Python Cookbook(第2版)中文版》一书中的第1章,第1.4节,作者[美]Alex Martelli , Anna Martelli Ravenscrof , David Ascher ,高铁军 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    1.4 字符串对齐

    任务

    实现字符串对齐:左对齐,居中对齐,或者右对齐。
    解决方案

    这正是string对象的ljust、rjust和center方法要解决的问题。每个方法都需要一个参数,指出生成的字符串的宽度,之后返回一个在左端、右端、或者两端都添加了空格的字符串拷贝:

    >>> print '|', 'hej'.ljust(20), '|', 'hej'.rjust(20), '|', 'hej'.center(20), '|'
    | hej             |             hej |       hej       |

    讨论

    我们常常能够碰到居中、左对齐或右对齐的文本—比如,你可能会打印一个简单的报告,并以monospace字体居中显示页码。正因为这种需求很常见,Python的string对象提供了三个简单好用的方法。在Python 2.3中,填充字符只能是空格。在Python 2.4中,默认情况下仍然使用空格,但是可以给这三种方法第二个参数,指定一个填充字符:

    >>> print 'hej'.center(20, '+')
    ++++++++hej+++++++++
    展开全文
  • 写了一个练手的爬虫…在输出的时候出现了让人很不愉:male_sign:悦的问题 像这样: 令人十分难受啊!...第一反应使用\t制表符,带来的问题便是字符串长度差距超过一个制表位时,会跳到下一个制表位,如图:
  • 尹成Python27天入门到项目实战

    千人学习 2020-12-05 17:04:22
    字符串实战简单回顾eval与exec简介字符串的简单规范字符串的截取字符串赋值规范字符串转义字符字符串常见运算符字符串格式化字符串格式化强化字符串编码简介dir与help查看str字符串函数第一个大写以及字符串居中显示...
  • python1119作业1

    2018-12-04 17:49:00
    xxx",要求输出的字符串占20个宽度,不够补*,居中对齐 2.人类的思维习惯于"四舍五入",请问int在做强转的时候会四舍五入吗?如果不会,想办法是的其进行四舍五入 3.python中的变量名字可以是中文吗?请尝试 4.下列...

    1. 写一段程序实现以下功能

      读入用户输入的姓名,打印"你好!xxx",要求输出的字符串占20个宽度,不够补*,居中对齐

    2.人类的思维习惯于"四舍五入",请问int在做强转的时候会四舍五入吗?如果不会,想办法是的其进行四舍五入

    3.python中的变量名字可以是中文吗?请尝试

    4.下列语句哪个是非法的

      a. x = y = z = 1  b. x=(y=z+1)  c. x, y = y, x  d. x += y

    5.以下各个语句的值

      a. 1 and 0 or 2 and 3 or 3 and 0

      b. 100 % 2 and 5 or 3 and 5 < 100

      c. 5 is 6 or 3 and 0 and 3

     

    转载于:https://www.cnblogs.com/yanzifamily/p/10065659.html

    展开全文
  • center()

    2019-02-13 15:43:42
    http://www.runoob.com/python/att-string-center.html 当字符串中文时,有时候没居中,这时候可以用 空额字符串代替: str.center(width,chr(12288))
  • 右对齐 ^ 居中 槽的设定输出宽度数字的千位分隔符适用于整数和浮点数浮点数小数部分的精度或字符串的最大输出长度整数类型b,c,d,o,x,X浮点数类型e,E,f,% 本文以大学排名的实例说明: def printUnivList(ulist,...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

python中文字符串居中

python 订阅