最近碰到了一个问题,项目中很多文件都是接手过来的中文命名的一些素材,结果在部署的时候文件名全都乱码了,导致项目无法正常运行。

后来请教了一位大佬怎么解决文件名乱码的问题,他说这个需要正面解决吗?不需要,把文件名全部改掉,文件名永远不要用中文,永远不要。

我想他这么说的话,一定也是凭经验得出来的。

这里也友情提示大家,项目里面文件永远不要用中文,永远不要!

好,那不用中文用啥?平时来看,一般我们都会用英文来命名,一般也不会出现中文,比如 resource, controller, result, view, spider 等等,所以绝大多数情况下,是不会出现什么问题的。但是也有个别的情况,比如一些素材、资源文件可能的中文命名的,那么这时候该咋办呢?

首先像,因为是中文资源文件,我们要改成非中文命名的,无非两种,一种是英文,一种是拼音。

如果改英文,当然可以翻译、我们想翻译的话,逐个人工翻译成本太高,机器翻译的话,翻译完可能有些文不对题了,而且我们自己也不知道一些奇怪的资源英语应该叫什么,所以到时候真的找起来都找不到了。

所以第二种解决方案,那就是拼音了。中文转拼音,很自然,而且一个字就对应一串拼音,而且也非常容易从拼音看懂是什么意思,所以这确实是一个不错的方案。

那么问题就来了,怎样把一批中文文件转拼音命名呢?下面就让我们来了解 Python 的一个库 PyPinyin 吧!

概述

Python 中提供了汉字转拼音的库,名字叫做 PyPinyin,可以用于汉字注音、排序、检索等等场合,是基于 hotto/pinyin 这个库开发的,一些站点链接如下:

GitHub: https://github.com/mozillazg/python-pinyin

文档:https://pypinyin.readthedocs.io/zh_CN/master/

PyPi:https://pypi.org/project/pypinyin/

它有这么几个特性:

根据词组智能匹配最正确的拼音。

支持多音字。

简单的繁体支持, 注音支持。

支持多种不同拼音/注音风格。

是不是等不及了呢?那就让我们来了解一下它的用法吧!

安装

首先就是这个库的安装了,通过 pip 安装即可:

pip3 install pypinyin

安装完成之后导入一下这个库,如果不报错,那就说明安装成功了。

>>> import pypinyin

好,接下来我们看下它的具体功能。

基本拼音

首先我们进行一下基本的拼音转换,方法非常简单,直接调用 pinyin 方法即可:

from pypinyin import pinyin

print(pinyin("中心"))

运行结果:

[["zhōng"], ["xīn"]]

可以看到结果会是一个二维的列表,每个元素都另外成了一个列表,其中包含了每个字的读音。

那么如果这个词是多音字咋办呢?比如 “朝阳”,它有两个读音,我们拿来试下:

from pypinyin import pinyin

print(pinyin("朝阳"))

运行结果:

[["zhāo"], ["yáng"]]

好吧,它只给出来了一个读音,但是如果我们想要另外一种读音咋办呢?

其实很简单,只需添加 heteronym 参数并设置为 True 就好了,我们试下:

from pypinyin import pinyin

print(pinyin("朝阳", heteronym=True))

运行结果:

[["zhāo", "cháo"], ["yáng"]]

OK 了,这下子就显示出来了两个读音了,而且我们也明白了结果为什么是一个二维列表,因为里面的一维的结果可能是多个,比如多音字的情况就是这样。

但这个多少解析起来有点麻烦,很多情况下我们是不需要管多音字的,我们只是用它来转换一下名字而已,而处理上面的二维数组又比较麻烦。

所以有没有一个方法直接给我们一个一维列表呢?有!

我们可以使用 lazy_pinyin 这个方法来生成,尝试一下:

from pypinyin import lazy_pinyin

print(lazy_pinyin("聪明的小兔子"))

运行结果:

["cong", "ming", "de", "xiao", "tu", "zi"]

这时候观察到得到的是一个列表,并且不再包含音调了。

这里我们就有一个疑问了,为啥 pinyin 方法返回的结果默认是带音调的,而 lazy_pinyin 是不带的,这里面就涉及到一个风格转换的问题了。

风格转换

我们可以对结果进行一些风格转换,比如不带声调风格、标准声调风格、声调在拼音之后、声调在韵母之后、注音风格等等,比如我们想要声调放在拼音后面,可以这么来实现:

from pypinyin import lazy_pinyin, Style

style = Style.TONE3

print(lazy_pinyin("聪明的小兔子", style=style))

运行结果:

["cong1", "ming2", "de", "xiao3", "tu4", "zi"]

可以看到运行结果每个拼音后面就多了一个声调,这就是其中的一个风格,叫做 TONE3,其实还有很多风格,下面是我从源码里面找出来的定义:

#: 普通风格,不带声调。如: 中国 -> ``zhong guo``

NORMAL = 0

#: 标准声调风格,拼音声调在韵母第一个字母上(默认风格)。如: 中国 -> ``zhōng guó``

TONE = 1

#: 声调风格2,即拼音声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> ``zho1ng guo2``

TONE2 = 2

#: 声调风格3,即拼音声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``zhong1 guo2``

TONE3 = 8

#: 声母风格,只返回各个拼音的声母部分(注:有的拼音没有声母,详见 `#27`_)。如: 中国 -> ``zh g``

INITIALS = 3

#: 首字母风格,只返回拼音的首字母部分。如: 中国 -> ``z g``

FIRST_LETTER = 4

#: 韵母风格,只返回各个拼音的韵母部分,不带声调。如: 中国 -> ``ong uo``

FINALS = 5

#: 标准韵母风格,带声调,声调在韵母第一个字母上。如:中国 -> ``ōng uó``

FINALS_TONE = 6

#: 韵母风格2,带声调,声调在各个韵母之后,用数字 [1-4] 进行表示。如: 中国 -> ``o1ng uo2``

FINALS_TONE2 = 7

#: 韵母风格3,带声调,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``ong1 uo2``

FINALS_TONE3 = 9

#: 注音风格,带声调,阴平(第一声)不标。如: 中国 -> ``ㄓㄨㄥ ㄍㄨㄛˊ``

BOPOMOFO = 10

#: 注音风格,仅首字母。如: 中国 -> ``ㄓ ㄍ``

BOPOMOFO_FIRST = 11

#: 汉语拼音与俄语字母对照风格,声调在各个拼音之后,用数字 [1-4] 进行表示。如: 中国 -> ``чжун1 го2``

CYRILLIC = 12

#: 汉语拼音与俄语字母对照风格,仅首字母。如: 中国 -> ``ч г``

CYRILLIC_FIRST = 13

有了这些,我们就可以轻松地实现风格转换了。

好,再回到原来的问题,为什么 pinyin 的方法默认带声调,而 lazy_pinyin 方法不带声调,答案就是:它们二者使用的默认风格不同,我们看下它的函数定义就知道了:

pinyin 方法的定义如下:

def pinyin(hans, style=Style.TONE, heteronym=False, errors="default", strict=True)

lazy_pinyin 方法的定义如下:

def lazy_pinyin(hans, style=Style.NORMAL, errors="default", strict=True)

这下懂了吧,因为 pinyin 方法默认使用了 TONE 的风格,而 lazy_pinyin 方法默认使用了 NORMAL 的风格,所以就导致二者返回风格不同了。

好了,有了这两个函数的定义,我们再来研究下其他的参数,比如定义里面的 errors 和 strict 参数又怎么用呢?

错误处理

在这里我们先做一个测试,比如我们传入无法转拼音的字,比如:

from pypinyin import lazy_pinyin

print(lazy_pinyin("你好☆☆,我是xxx"))

其中包含了星号两个,还有标点一个,另外还包含了一个 xxx 英文字符,结果会是什么呢?

["ni", "hao", "☆☆,", "wo", "shi", "xxx"]

可以看到结果中星号和英文字符都作为一个整体并原模原样返回了。

那么这种特殊字符可以单独进行处理吗?当然可以,这里就用到刚才提到的 errors 参数了。

errors 参数是有几种模式的:

default:默认行为,不处理,原木原样返回

ignore:忽略字符,直接抛掉

replace:直接替换为去掉 u 的 unicode 编码

callable 对象:当传入一个可调用的对象的时候,则可以自定义处理方式。

下面是 errors 这个参数的源码实现逻辑:

def _handle_nopinyin_char(chars, errors="default"):

"""处理没有拼音的字符"""

if callable_check(errors):

return errors(chars)

if errors == "default":

return chars

elif errors == "ignore":

return None

elif errors == "replace":

if len(chars) > 1:

return "".join(text_type("%x" % ord(x)) for x in chars)

else:

return text_type("%x" % ord(chars))

当处理没有拼音的字符的时候,errors 的不同参数会有不同的处理结果,更详细的逻辑可以翻看源码。

好了,下面我们来尝试一下,比如我们想将不能转拼音的字符去掉,则可以这么设置:

from pypinyin import lazy_pinyin

print(lazy_pinyin("你好☆☆,我是xxx", errors="ignore"))

运行结果:

["ni", "hao", "wo", "shi"]

如果我们想要自定义处理,比如把 ☆ 转化为 ※,则可以这么设置:

print(lazy_pinyin("你好☆☆,我是xxx", errors=lambda item: "".join(["※" if c == "☆" else c for c in item])))

运行结果:

["ni", "hao", "※※,", "wo", "shi", "xxx"]

如上便是一些相关异常处理的操作,我们可以随心所欲地处理自己想处理的字符了。

严格模式

最后再看下 strict 模式,这个参数用于控制处理声母和韵母时是否严格遵循 《汉语拼音方案》 标准。

下面的一些说明来源于官方文档:

当 strict 参数为 True 时根据 《汉语拼音方案》 的如下规则处理声母、在韵母相关风格下还原正确的韵母:

21 个声母: b p m f d t n l g k h j q x zh ch sh r z c s (y, w 不是声母)

i行的韵母,前面没有声母的时候,写成yi(衣),ya(呀),ye(耶),yao(腰),you(忧),yan(烟), yin(因),yang(央),ying(英),yong(雍)。(y 不是声母)

u行的韵母,前面没有声母的时候,写成wu(乌),wa(蛙),wo(窝),wai(歪),wei(威),wan(弯), wen(温),wang(汪),weng(翁)。(w 不是声母)

ü行的韵母,前面没有声母的时候,写成yu(迂),yue(约),yuan(冤),yun(晕);ü上两点省略。 (韵母相关风格下还原正确的韵母 ü)

ü行的韵跟声母j,q,x拼的时候,写成ju(居),qu(区),xu(虚),ü上两点也省略; 但是跟声母n,l拼的时候,仍然写成nü(女),lü(吕)。(韵母相关风格下还原正确的韵母 ü)

iou,uei,uen前面加声母的时候,写成iu,ui,un。例如niu(牛),gui(归),lun(论)。 (韵母相关风格下还原正确的韵母 iou,uei,uen)

当 strict 为 False 时就是不遵守上面的规则来处理声母和韵母, 比如:y, w 会被当做声母,yu(迂) 的韵母就是一般认为的 u 等。

具体差异可以查看源码中 tests/test_standard.py 中的对比结果测试用例。

自定义拼音

如果对库返回的结果不满意,我们还可以自定义自己的拼音库,这里用到的方法就有 load_single_dict 和 load_phrases_dict 方法了。

本博客源码Github地址:

请随手给个star,谢谢!

python 将中文变为拼音_python如何使用pypinyin将中文转换为拼音 详细介绍相关推荐

  1. python里面如何将数字转换成中文的形式_python中将阿拉伯数字转换成中文的实现代码...

    #!/usr/bin/python #-*- encoding: utf-8 -*- import types class NotIntegerError(Exception): pass class ...

  2. php 将中文字符转英文字母_PHP实现将汉字转换为拼音及获取词语首字母的方法...

    本文实例讲述了PHP实现将汉字转换为拼音及获取词语首字母的方法.分享给大家供大家参考,具体如下: 最近要开发将汉字转换为拼音和得到首字的功能记录下来哈子:呵呵~ class Pinyin{ priva ...

  3. python中将字符变为大写_Python笔记(一)

    来源网络 前言 Python作为一种解释性高级语言,语法简单,较轻巧,俗称"胶水语言",常用于数据爬取与分析.科学计算和人工智能等领域.目前,Python有Python2和Pyth ...

  4. python中将字符变为大写_Python实现将字符串的首字母变为大写,其余都变为小写的方法...

    Python实现将字符串的首字母变为大写,其余都变为小写的方法 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字. 思路:使用capitalize()函数将字符串的 ...

  5. python里面如何将数字转换成中文的形式_Python怎么把数字变成中文?

    python将数字转换为中文的方法: 在字典中设置0-9为键,值为数字对应的中文,转换数字时获取字典中指定键对应的值即可.dict1={'0': '零', '1': '一', '2': '二', '3 ...

  6. python不能输入中文字_Python脚本中无法输入中文解决办法

    刚接触Python语言,在练习的时候发现脚本里无法出现中文(Python2.x中不支持中文,以下指仅在Python2.x环境下,Python3.x默认已支持中文),输入中文后,脚本会闪退,无法运行,例 ...

  7. python的重点和难点_python知识点汇总-Go语言中文社区

    1.反编译: 1.1Windows下生成pyd文件(加密) [Windows下安装Python扩展提示"Unable to find vcvarsall.bat"](https:/ ...

  8. python中将字符变为大写_python如何同时把字符串大写变小写,小写变大写

    展开全部 可以32313133353236313431303231363533e78988e69d8331333431356663使用Python swapcase()方法 1.描述: Python ...

  9. python中文字体下载_python中matlabplot和seaborn中文字体显示的一种解决方案

    经过测试,该方法有效,分享一波,不多说了,直接上干货: 主要经过四步,比较永久的一种方法,适合需要经常显示中文标题 第一步:安装黑体SimHei.ttf 在这个百度云盘中下载: 链接:https:// ...

  10. 用python将图片变为油画_Python也能成为毕加索?我用Python给小姐姐画了幅油画

    原标题:Python也能成为毕加索?我用Python给小姐姐画了幅油画 小编的舍友最近交了一个女朋友,是念艺术系的,擅长画画!长的好看又漂亮,舍友经常在我耳边吹嘘,女朋友画的油画多么漂亮. 哎...经 ...

最新文章

  1. 德州农工大学 计算机排名,德州农工大学美国大学排名及专业排名汇总(USNEWS美国大学排名版)...
  2. Bootstrap基础二十七 多媒体对象(Media Object)
  3. 拆半查找的递归和非递归算法
  4. java 蓝桥杯算法提高 成绩排序2
  5. html 3d坐标,HTML3D
  6. VB谨慎使用IsMissing函数
  7. [转]错误“AxImp.exe”已退出,代码为 -1163019603。
  8. 大学python挂科补考_大一就挂科了,怎么办。感觉没了信心?
  9. 人工智能目标检测模型总结(三)——yolov1模型(1)
  10. 二叉树遍历算法的应用
  11. 基于NFC的Android读写软件,基于Android的NFC商场助手软件的设计与实现
  12. PTA-Python题库(浙大版Python程序设计教材对应练习) 题解索引
  13. lr常见问题汇总(持续更新版)
  14. antdesign a-model 组件去掉背景色
  15. 强烈呼吁弃用Notepad++,推荐几款优秀替代品
  16. 别了甲骨文,别了拉里·埃里森!
  17. Element UI-动态合并表格行
  18. Tabs | jQuery UI
  19. 从开发到销售:软件商如何管理你的典型客户
  20. 普通人如何在网上能月入3000以上

热门文章

  1. Docker数据卷映射
  2. 人生成绩单97php,2020年国际国内正赛男乒成绩单,樊振东冠军最多。
  3. 基于C++实现惊险刺激的Flappy Bird设计
  4. FinalReport连接MYSQL数据库失败经验分享
  5. 五笔速成法--教你5小时学会五笔打字
  6. IE8中怎样使用脚本隐藏弹出窗口的地址栏
  7. VirtualBox如何添加ISO文件
  8. Orge配置Debug - 在Mac上利用Homebrew安装指定版本的Cmake
  9. Okhttp简单介绍
  10. html怎么直接修改,如何编辑运行HTML网页文件(HTML编辑工具使用介绍)