Python語(yǔ)音合成的項(xiàng)目實(shí)戰(zhàn)(PyQt5+pyttsx3)
TTS簡(jiǎn)介
TTS(Text To Speech)是一種語(yǔ)音合成技術(shù),可以讓機(jī)器將輸入文本以語(yǔ)音的方式播放出來(lái),實(shí)現(xiàn)機(jī)器說(shuō)話(huà)的效果。
TTS分成語(yǔ)音處理及語(yǔ)音合成,先由機(jī)器識(shí)別輸入的文字,再根據(jù)語(yǔ)音庫(kù)進(jìn)行語(yǔ)音合成?,F(xiàn)在有很多可供調(diào)用的TTS接口,比如百度智能云的語(yǔ)音合成接口。微軟在Windows系統(tǒng)中也提供了TTS的接口,可以調(diào)用此接口實(shí)現(xiàn)離線(xiàn)的TTS語(yǔ)音合成功能。
本文將使用pyttsx3庫(kù)作為示范,編寫(xiě)一個(gè)語(yǔ)音合成小工具。
pyttsx3官方文檔:https://pyttsx3.readthedocs.io
本文源碼已上傳至GitHub:
https://github.com/XMNHCAS/SpeechSynthesisTool
安裝需要的包
安裝PyQt5及其GUI設(shè)計(jì)工具
# 安裝PyQt5 pip install PyQt5 # 安裝PyQt5設(shè)計(jì)器 pip install PyQt5Designer
本文使用的編輯器是VSCode,不是PyCharm,使用PyQt5的方式可能存在差異,具體使用時(shí)可以根據(jù)實(shí)際情況進(jìn)行配置。
安裝pyttsx3
pip install pyttsx3
UI界面
可參考下圖設(shè)計(jì)簡(jiǎn)單的GUI界面,由于本文主要為功能實(shí)例,故不考慮界面美觀(guān)問(wèn)題。

界面應(yīng)有一個(gè)文本輸入框,用以輸入將要轉(zhuǎn)化為語(yǔ)音的文本,同時(shí)需要一個(gè)播放按鈕,用以觸發(fā)語(yǔ)音播放的方法。語(yǔ)速、音量和語(yǔ)言可以按需選擇。
使用PyQt5的設(shè)計(jì)工具,可以根據(jù)以上配置的GUI界面生成以下UI(XML)代碼:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>313</width>
<height>284</height>
</rect>
</property>
<property name="windowTitle">
<string>語(yǔ)音合成器</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>voice.ico</normaloff>voice.ico</iconset>
</property>
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>291</width>
<height>261</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>20</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>播報(bào)文本</string>
</property>
<property name="alignment">
<set>Qt::AlignJustify|Qt::AlignTop</set>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="tbx_text"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>語(yǔ)速</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="slider_rate">
<property name="maximum">
<number>300</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_rate">
<property name="minimumSize">
<size>
<width>30</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>音量</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="slider_volumn">
<property name="maximum">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_volumn">
<property name="minimumSize">
<size>
<width>30</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>選擇語(yǔ)言</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbtn_zh">
<property name="text">
<string>中文</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbtn_en">
<property name="text">
<string>英文</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_5">
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_play">
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="text">
<string>播放</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>最后再使用PyQt5的界面工具,可以根據(jù)以上UI的代碼,生成以下的窗體類(lèi):
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'd:\Program\VSCode\Python\TTS_PyQT\tts_form.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(313, 284)
icon = QtGui.QIcon()
icon.addPixmap(
QtGui.QPixmap("./voice.ico"),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
Form.setWindowIcon(icon)
self.verticalLayoutWidget = QtWidgets.QWidget(Form)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 291, 261))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(20)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label.setAlignment(QtCore.Qt.AlignJustify | QtCore.Qt.AlignTop)
self.label.setObjectName("label")
self.horizontalLayout_2.addWidget(self.label)
self.tbx_text = QtWidgets.QTextEdit(self.verticalLayoutWidget)
self.tbx_text.setObjectName("tbx_text")
self.horizontalLayout_2.addWidget(self.tbx_text)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_3 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_3.setObjectName("label_3")
self.horizontalLayout_4.addWidget(self.label_3)
self.slider_rate = QtWidgets.QSlider(self.verticalLayoutWidget)
self.slider_rate.setMaximum(300)
self.slider_rate.setOrientation(QtCore.Qt.Horizontal)
self.slider_rate.setObjectName("slider_rate")
self.horizontalLayout_4.addWidget(self.slider_rate)
self.label_rate = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_rate.setMinimumSize(QtCore.QSize(30, 0))
self.label_rate.setAlignment(QtCore.Qt.AlignCenter)
self.label_rate.setObjectName("label_rate")
self.horizontalLayout_4.addWidget(self.label_rate)
self.verticalLayout.addLayout(self.horizontalLayout_4)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_2.setObjectName("label_2")
self.horizontalLayout_3.addWidget(self.label_2)
self.slider_volumn = QtWidgets.QSlider(self.verticalLayoutWidget)
self.slider_volumn.setMaximum(100)
self.slider_volumn.setOrientation(QtCore.Qt.Horizontal)
self.slider_volumn.setObjectName("slider_volumn")
self.horizontalLayout_3.addWidget(self.slider_volumn)
self.label_volumn = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_volumn.setMinimumSize(QtCore.QSize(30, 0))
self.label_volumn.setAlignment(QtCore.Qt.AlignCenter)
self.label_volumn.setObjectName("label_volumn")
self.horizontalLayout_3.addWidget(self.label_volumn)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.label_4 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_4.setObjectName("label_4")
self.horizontalLayout.addWidget(self.label_4)
self.rbtn_zh = QtWidgets.QRadioButton(self.verticalLayoutWidget)
self.rbtn_zh.setChecked(True)
self.rbtn_zh.setObjectName("rbtn_zh")
self.horizontalLayout.addWidget(self.rbtn_zh)
self.rbtn_en = QtWidgets.QRadioButton(self.verticalLayoutWidget)
self.rbtn_en.setObjectName("rbtn_en")
self.horizontalLayout.addWidget(self.rbtn_en)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.label_5 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_5.setMinimumSize(QtCore.QSize(60, 0))
self.label_5.setText("")
self.label_5.setObjectName("label_5")
self.horizontalLayout_5.addWidget(self.label_5)
self.btn_play = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.btn_play.setMinimumSize(QtCore.QSize(0, 30))
self.btn_play.setObjectName("btn_play")
self.horizontalLayout_5.addWidget(self.btn_play)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "語(yǔ)音合成器"))
self.label.setText(_translate("Form", "播報(bào)文本"))
self.label_3.setText(_translate("Form", "語(yǔ)速"))
self.label_rate.setText(_translate("Form", "0"))
self.label_2.setText(_translate("Form", "音量"))
self.label_volumn.setText(_translate("Form", "0"))
self.label_4.setText(_translate("Form", "選擇語(yǔ)言"))
self.rbtn_zh.setText(_translate("Form", "中文"))
self.rbtn_en.setText(_translate("Form", "英文"))
self.btn_play.setText(_translate("Form", "播放"))如果直接復(fù)制此代碼,可能會(huì)出現(xiàn)圖標(biāo)丟失的問(wèn)題。這個(gè)需要根據(jù)實(shí)際情況修改icon的配置,并添加要使用的ico圖標(biāo)文件。
功能代碼
語(yǔ)音工具類(lèi)
首先我們需要初始化并獲取語(yǔ)音合成用的語(yǔ)音引擎對(duì)象。
# tts對(duì)象 engine = pyttsx3.init()
我們可以通過(guò)該對(duì)象的setProperty方法,對(duì)語(yǔ)音合成的對(duì)象的屬性進(jìn)行修改:
| 屬性名 | 解釋 |
| rate | 以每分鐘字?jǐn)?shù)表示的整數(shù)語(yǔ)速 |
| volume | 音量,取值范圍為[0.0, 1.0] |
| voices | 語(yǔ)音的字符串標(biāo)識(shí)符 |
語(yǔ)音工具類(lèi)代碼如下,代碼含義可參考注釋?zhuān)?/p>
import pyttsx3
class VoiceEngine():
'''
tts 語(yǔ)音工具類(lèi)
'''
def __init__(self):
'''
初始化
'''
# tts對(duì)象
self.__engine = pyttsx3.init()
# 語(yǔ)速
self.__rate = 150
# 音量
self.__volume = 100
# 語(yǔ)音ID,0為中文,1為英文
self.__voice = 0
@property
def Rate(self):
'''
語(yǔ)速屬性
'''
return self.__rate
@Rate.setter
def Rate(self, value):
self.__rate = value
@property
def Volume(self):
'''
音量屬性
'''
return self.__volume
@Volume.setter
def Volume(self, value):
self.__volume = value
@property
def VoiceID(self):
'''
語(yǔ)音ID:0 -- 中文;1 -- 英文
'''
return self.__voice
@VoiceID.setter
def VoiceID(self, value):
self.__voice = value
def Say(self, text):
'''
播放語(yǔ)音
'''
self.__engine.setProperty('rate', self.__rate)
self.__engine.setProperty('volume', self.__volume)
# 獲取可用語(yǔ)音列表,并設(shè)置語(yǔ)音
voices = self.__engine.getProperty('voices')
self.__engine.setProperty('voice', voices[self.__voice].id)
# 保存語(yǔ)音文件
# self.__engine.save_to_file(text, 'test.mp3')
self.__engine.say(text)
self.__engine.runAndWait()
self.__engine.stop()窗體類(lèi)
我們可以創(chuàng)建一個(gè)繼承于我們剛剛創(chuàng)建的PyQt5的窗體類(lèi),并為窗體的拖拽事件和點(diǎn)擊事件注冊(cè)回調(diào)函數(shù),同時(shí)創(chuàng)建一個(gè)語(yǔ)音工具類(lèi)的實(shí)例,用以實(shí)現(xiàn)指定事件觸發(fā)時(shí)需要執(zhí)行的語(yǔ)音操作。
import sys
import _thread as th
from PyQt5.QtWidgets import QMainWindow, QApplication
from Ui_tts_form import Ui_Form
class MainWindow(QMainWindow, Ui_Form):
'''
窗體類(lèi)
'''
def __init__(self, parent=None):
'''
初始化窗體
'''
super(MainWindow, self).__init__(parent)
self.setupUi(self)
# 獲取tts工具類(lèi)實(shí)例
self.engine = VoiceEngine()
self.__isPlaying = False
# 設(shè)置初始文本
self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
# 進(jìn)度條數(shù)據(jù)綁定到label中顯示
self.slider_rate.valueChanged.connect(self.setRateTextValue)
self.slider_volumn.valueChanged.connect(self.setVolumnTextValue)
# 設(shè)置進(jìn)度條初始值
self.slider_rate.setValue(self.engine.Rate)
self.slider_volumn.setValue(self.engine.Volume)
# RadioButton選擇事件
self.rbtn_zh.toggled.connect(self.onSelectVoice_zh)
self.rbtn_en.toggled.connect(self.onSelectVoice_en)
# 播放按鈕點(diǎn)擊事件
self.btn_play.clicked.connect(self.onPlayButtonClick)
def setRateTextValue(self):
'''
修改語(yǔ)速label文本值
'''
value = self.slider_rate.value()
self.label_rate.setText(str(value))
self.engine.Rate = value
def setVolumnTextValue(self):
'''
修改音量label文本值
'''
value = self.slider_volumn.value()
self.label_volumn.setText(str(value / 100))
self.engine.Volume = value
def onSelectVoice_zh(self):
'''
修改中文的語(yǔ)音配置及默認(rèn)播放文本
'''
self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
self.engine.VoiceID = 0
def onSelectVoice_en(self):
'''
修改英文的語(yǔ)音配置及默認(rèn)的播放文本
'''
self.tbx_text.setText('Hello World')
self.engine.VoiceID = 1
def playVoice(self):
'''
播放
'''
if self.__isPlaying is not True:
self.__isPlaying = True
text = self.tbx_text.toPlainText()
self.engine.Say(text)
self.__isPlaying = False
def onPlayButtonClick(self):
'''
播放按鈕點(diǎn)擊事件
開(kāi)啟線(xiàn)程新線(xiàn)程播放語(yǔ)音,避免窗體因?yàn)檎Z(yǔ)音播放而假卡死
'''
th.start_new_thread(self.playVoice, ())完整代碼
import sys
import _thread as th
from PyQt5.QtWidgets import QMainWindow, QApplication
from Ui_tts_form import Ui_Form
import pyttsx3
class VoiceEngine():
'''
tts 語(yǔ)音工具類(lèi)
'''
def __init__(self):
'''
初始化
'''
# tts對(duì)象
self.__engine = pyttsx3.init()
# 語(yǔ)速
self.__rate = 150
# 音量
self.__volume = 100
# 語(yǔ)音ID,0為中文,1為英文
self.__voice = 0
@property
def Rate(self):
'''
語(yǔ)速屬性
'''
return self.__rate
@Rate.setter
def Rate(self, value):
self.__rate = value
@property
def Volume(self):
'''
音量屬性
'''
return self.__volume
@Volume.setter
def Volume(self, value):
self.__volume = value
@property
def VoiceID(self):
'''
語(yǔ)音ID:0 -- 中文;1 -- 英文
'''
return self.__voice
@VoiceID.setter
def VoiceID(self, value):
self.__voice = value
def Say(self, text):
'''
播放語(yǔ)音
'''
self.__engine.setProperty('rate', self.__rate)
self.__engine.setProperty('volume', self.__volume)
voices = self.__engine.getProperty('voices')
self.__engine.setProperty('voice', voices[self.__voice])
# 保存語(yǔ)音文件
# self.__engine.save_to_file(text, 'test.mp3')
self.__engine.say(text)
self.__engine.runAndWait()
self.__engine.stop()
class MainWindow(QMainWindow, Ui_Form):
'''
窗體類(lèi)
'''
def __init__(self, parent=None):
'''
初始化窗體
'''
super(MainWindow, self).__init__(parent)
self.setupUi(self)
# 獲取tts工具類(lèi)實(shí)例
self.engine = VoiceEngine()
self.__isPlaying = False
# 設(shè)置初始文本
self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
# 進(jìn)度條數(shù)據(jù)綁定到label中顯示
self.slider_rate.valueChanged.connect(self.setRateTextValue)
self.slider_volumn.valueChanged.connect(self.setVolumnTextValue)
# 設(shè)置進(jìn)度條初始值
self.slider_rate.setValue(self.engine.Rate)
self.slider_volumn.setValue(self.engine.Volume)
# RadioButton選擇事件
self.rbtn_zh.toggled.connect(self.onSelectVoice_zh)
self.rbtn_en.toggled.connect(self.onSelectVoice_en)
# 播放按鈕點(diǎn)擊事件
self.btn_play.clicked.connect(self.onPlayButtonClick)
def setRateTextValue(self):
'''
修改語(yǔ)速label文本值
'''
value = self.slider_rate.value()
self.label_rate.setText(str(value))
self.engine.Rate = value
def setVolumnTextValue(self):
'''
修改音量label文本值
'''
value = self.slider_volumn.value()
self.label_volumn.setText(str(value / 100))
self.engine.Volume = value
def onSelectVoice_zh(self):
'''
修改中文的語(yǔ)音配置及默認(rèn)播放文本
'''
self.tbx_text.setText('床前明月光,疑似地上霜。\n舉頭望明月,低頭思故鄉(xiāng)。')
self.engine.VoiceID = 0
def onSelectVoice_en(self):
'''
修改英文的語(yǔ)音配置及默認(rèn)的播放文本
'''
self.tbx_text.setText('Hello World')
self.engine.VoiceID = 1
def playVoice(self):
'''
播放
'''
if self.__isPlaying is not True:
self.__isPlaying = True
text = self.tbx_text.toPlainText()
self.engine.Say(text)
self.__isPlaying = False
def onPlayButtonClick(self):
'''
修改語(yǔ)速label文本值
'''
th.start_new_thread(self.playVoice, ())
if __name__ == "__main__":
'''
主函數(shù)
'''
app = QApplication(sys.argv)
form = MainWindow()
form.show()
sys.exit(app.exec_())到此這篇關(guān)于Python語(yǔ)音合成的項(xiàng)目實(shí)戰(zhàn)(PyQt5+pyttsx3)的文章就介紹到這了,更多相關(guān)Python語(yǔ)音合成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于Python調(diào)用百度語(yǔ)音合成SDK實(shí)現(xiàn)文字轉(zhuǎn)音頻的方法
- Python調(diào)用訊飛語(yǔ)音合成API接口來(lái)實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音
- Python人工智能語(yǔ)音合成實(shí)現(xiàn)案例詳解
- 基于Python實(shí)現(xiàn)語(yǔ)音合成小工具
- 基于Python編寫(xiě)一個(gè)語(yǔ)音合成系統(tǒng)
- Python實(shí)現(xiàn)語(yǔ)音合成功能詳解
- python3實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字(語(yǔ)音識(shí)別)和文字轉(zhuǎn)語(yǔ)音(語(yǔ)音合成)
- Python實(shí)現(xiàn)語(yǔ)音識(shí)別和語(yǔ)音合成功能
- python騰訊語(yǔ)音合成實(shí)現(xiàn)過(guò)程解析
- Python中edge-tts實(shí)現(xiàn)便捷語(yǔ)音合成
相關(guān)文章
Python控制臺(tái)實(shí)現(xiàn)交互式環(huán)境執(zhí)行
這篇文章主要介紹了Python程序如何在交互式環(huán)境中執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
基于Python中numpy數(shù)組的合并實(shí)例講解
下面小編就為大家分享一篇基于Python中numpy數(shù)組的合并實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python爬蟲(chóng)利用多線(xiàn)程爬取 LOL 高清壁紙
這篇文章主要介紹了Python爬蟲(chóng)利用多線(xiàn)程爬取 LOL 高清壁紙,通過(guò)網(wǎng)站爬取每一個(gè)英雄的所有皮膚圖片,全部下載下來(lái)并保存到本地,下文爬取過(guò)程感興趣的朋友可以參考一下2022-06-06
如何使用七牛Python SDK寫(xiě)一個(gè)同步腳本及使用教程
七牛云存儲(chǔ)的 Python 語(yǔ)言版本 SDK(本文以下稱(chēng) Python-SDK)是對(duì)七牛云存儲(chǔ)API協(xié)議的一層封裝,以提供一套對(duì)于 Python 開(kāi)發(fā)者而言簡(jiǎn)單易用的開(kāi)發(fā)工具本篇文章給大家介紹如何使用七牛Python SDK寫(xiě)一個(gè)同步腳本及使用及使用教程,需要的朋友可以參考下2015-08-08
Python讀取CSV文件并進(jìn)行數(shù)據(jù)可視化
這篇文章主要為大家詳細(xì)介紹了Python如何讀取CSV文件并進(jìn)行數(shù)據(jù)可視化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
簡(jiǎn)單分析Python中用fork()函數(shù)生成的子進(jìn)程
這篇文章主要介紹了Python中用fork()函數(shù)生成的子進(jìn)程,分析子進(jìn)程與父進(jìn)程的執(zhí)行順序,需要的朋友可以參考下2015-05-05

