Python為文件批量注音(生僻字歌詞為例)

2021-09-27 11:11:58 字數 3638 閱讀 3675

抖音配樂--生僻字

python的拼音模組

python的模組庫api,每次進去習慣第一動作,就是右鍵翻譯為中文。(好羞愧,個人太愛國了,所以一直排斥學英語,好不要臉的藉口...)可python的拼音模組不需要這麼做,因為涉及拼音等模組肯定和中文有關係,文件自然是中文的嘍。

那麼python的拼音模組是什麼?pypinyin

安裝pip install pypinyin

使用示例

>>> from pypinyin import pinyin, lazy_pinyin, style

>>> pinyin('中心')

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

>>> pinyin('中心', heteronym=true) # 啟用多音字模式

[['zhōng', 'zhòng'], ['xīn']]

>>> pinyin('中心', style=style.first_letter) # 設定拼音風格

[['z'], ['x']]

>>> pinyin('中心', style=style.tone2, heteronym=true)

[['zho1ng', 'zho4ng'], ['xi1n']]

>>> pinyin('中心', style=style.bopomofo) # 注音風格

[['ㄓㄨㄥ'], ['ㄒㄧㄣ']]

>>> pinyin('中心', style=style.cyrillic) # 俄語字母風格

[['чжун1'], ['синь1']]

>>> lazy_pinyin('中心') # 不考慮多音字的情況

['zhong', 'xin']

# python 3(python 2 下把 '中心' 替換為 u'中心' 即可):

實現分析

起初想著,既然有了這個強大的拼音模組,那麼文字批量新增拼音,豈不是分分鐘的事情了嗎?然後,打臉接踵而來!

首先,要實現文字上一一對應的標註拼音,每個字與拼音的長度肯定不同,沒辦法對其。如果要對其,就得將文字進行拆分,字與字之間新增間距。有人說簡單啊,每個字的拼音最多不過6為,那我們使用列表解析式[i.just(6) for i in line]不就完了?

聽起來沒毛病,但是...

中文識別

本來考慮使用正則去判斷中文的,因為網上查到正則的匹配中文是[\u4e00-\u9fa5],簡單測試了下,貌似沒毛病

然後...**都快寫完了發現有些生僻字不再這個範圍內,我擦!

'\u4e00'<='生'<='\u9fa5'

true

'\u4e00'<='僻'<='\u9fa5'

true

'\u4e00'<='字'<='\u9fa5'

true

'\u4e00'<='㙓'<='\u9fa5'

false

生僻字果然沒那麼好處理,但我這麼追求完美的**座大叔,怎麼能容忍特例的出現呢?

解決辦法

針對正則匹配問題,深入去研究,就脫離了學python的初衷,即便解決了也收穫甚微,不如換個思路。

utf-8字元編碼下,乙個中文字元佔3個位元組,但是字元的長度僅為1,那麼解析中文的方式是否可以變通為:

len(bytes(str,'utf-8) == 3 and len(string) == 1)

關於文字書寫,我們判斷中文後,如果是漢字str.ljust(5),否則str.ljust(6)不就行了(因為乙個漢字佔兩個字元長度)。

**實現

# -*- coding: utf-8 -*-

# @author : 王翔

# @jianshu : 清風python

# @date : 2019/5/18 22:53

# software : pycharm

# version: python 3.6.8

# @file : chromepassword.py

from pypinyin import pinyin

import re

class changepinyin:

def __init__(self, filename):

self.file = filename

self.lyric = self.read_file()

self.pinyin =

def read_file(self):

with open(self.file, encoding='utf-8') as f:

return f.readlines()

def write_file(self):

with open('new_%s' % self.file, 'w', encoding='utf-8') as f:

print(self.lyric)

for line in self.lyric:

# print(line)

if line.strip() == '':

continue

_new_line = re.sub(r'\s', '', line)

# 行內容轉拼音

_pinyin = ''.join(map(lambda x: x[0].ljust(6), pinyin(_new_line)))

# 根據中英文,將行內容進行字元與漢字的拆分

_lyric = self.split_words(_new_line)

f.write('%s\n%s\n' % (_pinyin, _lyric))

@staticmethod

def split_words(words):

word_list = ""

tmp = ""

for string in words:

if len(bytes(string, 'utf-8')) == 3 and len(string) == 1:

if tmp != '':

word_list += tmp.ljust(6)

tmp = ""

word_list += string.ljust(5)

else:

tmp += string

return word_list

if __name__ == '__main__':

main = changepinyin('lyric.txt')

main.write_file()

看看最後的實現效果吧,是不是格式很工整!

文字注音效果.gif

錄屏軟體為licecap

它是一款螢幕錄製工具,支援匯出 gif 動畫格式,輕量級、使用簡單,錄製過程中可以隨意改變錄屏範圍。

好了,今天的內容就到這裡,希望大家喜歡,如果覺得文章有用,記得關注支援我啊。

Python批量轉mat為csv

matlab和python同時處理一批資料,matlab可以生成很實用的mat檔案,python可以進一步處理分析,並畫出漂亮的資料圖。本人用matlab生成多個mat檔案,每個mat檔案中又包含struct欄位,需要讀取每個struct中的每乙個資料,並分別在不同的資料夾下儲存為csv,資料如下圖...

使用python為檔案批量重新命名 更改路徑

本程式的目的 給 huhu 資料夾下的檔案重新取名字 使用python程式將 huhu 資料夾下邊的檔案移動到 new path 對應的資料夾下 import os import sys import io import shutil 改變標準輸出的預設編碼 defrename dirname 該資...

Python批量刪除結尾為指定字串的檔案

在做資料清洗的時候,會遇到一部分資料會用到,一部分資料需丟棄的情況,可以做乙個字串篩選器,完成自動化操作 同時刪除了以region結尾的jpg和xml檔案 import os def del files path for root dirs,files in os.walk path for nam...