数字音频处理

采样频率

量化位数

声道数

比特率 = 采样频率x量化位数x声道数 单位时间的比特数,单位:比特/秒(bps)

比特率x持续时间(秒) = 数据量(比特)

利用Python查看音频参数

#查看 record.mp3 的相关参数from pydub import AudioSegment as AS
song = AS.from_file('record.mp3', format = 'mp3')
print('时长:%.1f秒' % (len(song)/1000))                  #时长,毫秒
print('采样频率:%.1fkHz' % (song.frame_rate/1000))       #采样频率,赫兹
print('量化位数:%d比特' % (song.sample_width*8))         #量化位数,字节
print('声道数:%d' % song.channels)                       #声道数

输出:

时长:16.7秒
采样频率:44.1kHz
量化位数:16比特
声道数:2

用 % 格式化字符串

'%d年%d月%d日是星期%d' % (y, m, d, w)

  这是一个对字符串进行处理的表达式,其格式包含以下三部分:

  1)左边是一个包含 n 个占位符的字符串(占位符以%开头,%d就是一种占位符);

  2)中间是一个%

  3)最后是 n 个用括号括起来、以逗号分割的值,这 n 个值与 n 个占位符一一对应。

其处理过程是用 n 个值替换 n 个占位符,如ymdw的值分别为 321、3、7、1,则本例的结果为:'321年3月7日是星期1'。尝试以下程序:

y, m, d, w = 321, 3, 7, 1
print('%d年%d月%d日是星期%d' % (y, m, d, w))

  用之前的方法也可以实现相同的功能(见下),但这种方式更加便于程序的编写、阅读和修改。

y, m, d, w = 321, 3, 7, 1
print(y, '年', m, '月', d, '日是星期', w)

占位符的类型

%d代表整数型

%f代表浮点型

%s代表字符串类型

在将值代入占位符时,会将值转换成占位符对应的类型,尝试如下程序:

print('%d' % (3.14))
print('%f' % (3))

 输出为:3

3.000000

不同类型的占位符还支持不同的格式设置,尝试如下程序:

print('%.2f' % (3.1415926))
print('%30s' % ('Hello World!'))
print('%30s' % ('Hello Python!'))

输出为:3.14
                                  Hello World!
                                 Hello Python!

  第 1 条语句中的 .2 表示保留两位小数,第 2、3 条语句中的30表示将字符串的宽度设置为 30 个字符(从而达到右对齐的效果)。

裁剪、拼接音频

#对 record.mp3 进行裁剪拼接,生成演唱部分 song.mp3from pydub import AudioSegment as AS
song = AS.from_file('record.mp3',format = 'mp3')
song = song[4000:8500] + song[10000:14500]
file = song.export('song.mp3', format = 'mp3')
file.close()

常见的音频格式:

wav(音质好,数据大)

mp3(压缩比高,压缩后音质较好)

flac(无损压缩)

rm

wma

#生成简谱对应的音乐 music.mp3

#生成简谱对应的音乐 music.mp3from pydub import AudioSegment as AS
duoRuiMi = []                           #用列表存放发音
duoRuiMi.append(AS.silent(500))         #第0号是0.5秒静音
for i in range(1,8):                    #第1-7号是哆瑞咪发嗦啦西s = AS.from_file(str(i) + '.mp3', format = 'mp3')duoRuiMi.append(s)
notation = '012311231034503450'         #简谱
music = AS.empty()                      #空音频
for i in notation:                      #据简谱拼接生成musicmusic = music + duoRuiMi[int(i)]
file = music.export('music.mp3', format = 'mp3')
file.close()

元组

各元素一经定义不能修改

定义元组:t = (1, 4, 9)

读取元组元素: print(t[0], t[-1])

文件合并

import os
print(os.path.isfile('红楼梦'))                  # 判断是否为文件
print(os.path.isdir('红楼梦'))                   # 判断是否为目录
print(os.path.join('红楼梦', '第001回.txt'))     # 形成路径
print(os.path.realpath('红楼梦\\第001回.txt'))   # 绝对路径
print(os.listdir('红楼梦'))                      # 获取目录下所有名称import os
if not os.path.exists('tmp'):                    # 判断路径是否存在 os.mkdir('tmp')                              # 新建目录import os
os.rename('tmp', 'abc')                          # 重命名

第一段输出:

False
True
红楼梦\第001回.txt
E:\My Python\文件合并工具\红楼梦\第001回.txt
['第001回.txt', '第002回.txt', '第003回.txt', '第004回.txt', '第005回.txt', '第006回.txt', '第007回.txt', '第008回.txt', '第009回.txt', '第010回.txt']

创建txt文档并写入内容:

txt = open('test.txt', 'a')  # 创建文档,'a'代表append,追加内容
txt.write('计算机\n')        # 写入内容,'\n'是换行符
txt.write('计算思维\n')
txt.write('Python\n')
txt.close()

读取txt文件内容:3种模式

read:读取所有内容,返回值是字符串

readline:读取一行,返回值是字符串

readlines:读取所有内容,返回值是列表

txt = open('test.txt', 'r')    # 模式一
print(txt.read())
txt.close()txt = open('test.txt', 'r')    # 模式二
print(txt.readlines())
txt.close()txt = open('test.txt', 'r')    # 模式三
print(txt.readline())
print(txt.readline())
print(txt.readline())
txt.close()

Python异常处理机制:

try

except

x = 0
try:y = 1/xprint(y)
except:print('x不能为0')
print('done')

文档合并

​
import os'''
获取dirpath文件夹下所有txt文件的路径
'''
def getTxtPaths(dirpath):paths = [ ]filenames = os.listdir(dirpath)for filename in filenames :filepath = os.path.join(dirpath,filename)if os.path.isfile(filepath) and filename.endswith('.txt'):paths.append(filepath)return paths'''
读取一个txt文件的内容,filepath是文件路径
'''
def readOneTxt(filepath):try:file = open(filepath, 'r')text = file.read()file.close()return textexcept:return '''''
将多个txt文件(原始文件)合并成一个txt文件(结果文件)
srcPaths是一个列表,存放了所有原始文件的路径
destPath是一个字符串,表示结果文件的路径
'''
def mergeTxts(srcPaths, destPath):destFile = open(destPath, 'w')for srcPath in srcPaths:text = readOneTxt(srcPath)if text != '':destFile.write(text)destFile.write('\n'*2+'-'*50+'\n'*2)destFile.close()return os.path.realpath(destPath)srcPaths = getTxtPaths('红楼梦')  #获取“红楼梦”文件夹下所有txt文件的路径
mergeTxts(srcPaths, 'result.txt') #对文本文件进行合并
print(readOneTxt('result.txt'))   #读取并打印结果文件​

查看系统进程信息

import psutil
for p in psutil.process_iter():try:print(p.pid)print(p.name())print(p.status())print(p.username())print(p.cpu_percent())print('-'*10)except:print('-'*10)

查看指定程序信息

import psutil
for p in psutil.process_iter():if 'notepad' in p.name().lower():    #notepad可换成其他程序相关名字print(p.name(), end='\t')print(p.cmdline())

用Python启动关闭程序

#打开记事本
from subprocess import Popen
Popen (['notepad.exe'])

用Python打开多个文件并关闭

from subprocess import Popen
import psutil
import os#打开一个文件
def openOneTxt(path):if os.path.exists(path) and path.endswith('.txt'):Popen(['notepad.exe', path])#打开多个txt文件
def openManyTxt(paths):for path in paths:openOneTxt(path)#关闭多个txt文件
def closeAllTxt():for p in psutil.process_iter():if p.name().lower()=='notepad.exe':p.terminate()import time
paths=['E:\\My Python\\4.4.6-文本合并功能-程序\\红楼梦\\第001回.txt','E:\\My Python\\4.4.6-文本合并功能-程序\\红楼梦\\第002回.txt','E:\\My Python\\4.4.6-文本合并功能-程序\\红楼梦\\第003回.txt','E:\\My Python\\4.4.6-文本合并功能-程序\\红楼梦\\第004回.txt']
openManyTxt(paths)
time.sleep(3)
closeAllTxt()

myFile.py

import os'''
获取dirpath文件夹下所有txt文件的路径
'''
def getTxtPaths(dirpath):paths = [ ]filenames = os.listdir(dirpath)for filename in filenames :filepath = os.path.join(dirpath,filename)if os.path.isfile(filepath) and filename.endswith('.txt'):paths.append(filepath)return paths'''
读取一个txt文件的内容,filepath是文件路径
'''
def readOneTxt(filepath):try:file = open(filepath, 'r')text = file.read()file.close()return textexcept:return '''''
将多个txt文件(原始文件)合并成一个txt文件(结果文件)
srcPaths是一个列表,存放了所有原始文件的路径
destPath是一个字符串,表示结果文件的路径
'''
def mergeTxts(srcPaths, destPath):destFile = open(destPath, 'w')for srcPath in srcPaths:text = readOneTxt(srcPath)if text != '':destFile.write(text)destFile.write('\n'*2+'-'*50+'\n'*2)destFile.close()return os.path.realpath(destPath)if __name__ == '__main__':srcPaths = getTxtPaths('红楼梦')  #获取“红楼梦”文件夹下所有txt文件的路径mergeTxts(srcPaths, 'result.txt') #对文本文件进行合并print(readOneTxt('result.txt'))   #读取并打印结果文件

myProcess.py

from subprocess import Popen
import psutil
import osdef openOneTxt(path):if os.path.exists(path) and path.endswith('.txt'):Popen( ['notepad.exe', path] )def openManyTxt(paths):for path in paths:openOneTxt(path)def closeAllTxt():for p in psutil.process_iter():if p.name().lower()=='notepad.exe':p.terminate()if __name__ == '__main__':import timepaths=['红楼梦\\第001回.txt','红楼梦\\第002回.txt','红楼梦\\第003回.txt','红楼梦\\第004回.txt']openManyTxt(paths)time.sleep(3)closeAllTxt()

文件合并工具集成程序

import tkinter as tk
from tkinter import scrolledtext
from tkinter import filedialog
import myFile        #自编模组
import myProcess     #自编模组#“添加文件”按钮的消息响应函数
def clickButton_addFile():filePaths=filedialog.askopenfilenames(title='选择文件',filetypes=[('txt', '.txt')])for filePath in filePaths:textbox_txtPath.insert(tk.END,filePath+'\n')textbox_txtPath.see(tk.END)#“添加文件夹”按钮的消息响应函数
def clickButton_addDir():dirpath=filedialog.askdirectory(title='选择文件夹')filePaths = myFile.getTxtPaths(dirpath)for filePath in filePaths:textbox_txtPath.insert(tk.END,filePath+'\n')textbox_txtPath.see(tk.END)#“开始合并”按钮的消息响应函数
def clickButton_merge():tmp = textbox_txtPath.get(0.0, tk.END)filePaths = tmp.split('\n')destPath = myFile.mergeTxts(filePaths, 'result.txt')textbox_resultPath.configure(state=tk.NORMAL)textbox_resultPath.delete(0.0, tk.END)textbox_resultPath.insert(0.0, destPath)textbox_resultPath.configure(state=tk.DISABLED) #“打开结果”按钮的消息响应函数
def clickButton_openResult():destFile = textbox_resultPath.get(0.0, tk.END).strip()myProcess.openOneTxt(destFile)#“打开原始文件”按钮的消息响应函数
def clickButton_openAll():tmp = textbox_txtPath.get(0.0, tk.END)filePaths = tmp.split('\n')myProcess.openManyTxt(filePaths)#“关闭所有文件”按钮的消息响应函数
def clickButton_closeAll():myProcess.closeAllTxt()#主窗口
window = tk.Tk()
window.title('文件合并工具')
window.geometry('440x600+300+200')
window.resizable(False, False)#“添加文件”按钮
button_addFile=tk.Button(window,text='添加文件',font=('楷体',12), command=clickButton_addFile)
button_addFile.place(x=20, y=20, width=120, height=40)#“添加文件夹”按钮
button_addDir=tk.Button(window,text='添加文件夹',font=('楷体',12), command=clickButton_addDir)
button_addDir.place(x=160, y=20, width=120, height=40)#“开始合并”按钮
button_merge=tk.Button(window,text='开始合并',font=('楷体',12), bg='orange', command=clickButton_merge)
button_merge.place(x=300, y=20, width=120, height=40)#用于展示所选文件对应路径的文本框(可滚动)
textbox_txtPath=scrolledtext.ScrolledText(window)
textbox_txtPath.place(x=20,y=70,width=400,height=400)#“生成结果”标签
label=tk.Label(window, text='生成结果:', font=('楷体',12))
label.place(x=20,y=490,width=100,height=40)#用于展示生成结果路径的文本框
textbox_resultPath=tk.Text(window)
textbox_resultPath.place(x=120,y=490,width=300,height=40)
textbox_resultPath.configure(state=tk.DISABLED)#不可修改#“打开结果”按钮
button_openResult=tk.Button(window,text='打开结果',font=('楷体',12), bg='orange', command=clickButton_openResult)
button_openResult.place(x=20, y=540, width=120, height=40)#“打开所有”按钮
button_openAll=tk.Button(window,text='打开原始文件',font=('楷体',12), command=clickButton_openAll)
button_openAll.place(x=160, y=540, width=120, height=40)#“关闭所有”按钮
button_closeAll=tk.Button(window,text='关闭所有文件',font=('楷体',12), command=clickButton_closeAll)
button_closeAll.place(x=300, y=540, width=120, height=40)#显示图形化界面
window.mainloop()

Python自学(三)相关推荐

  1. 孤荷凌寒自学python第三十八天初识python的线程控制

    孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看着 ...

  2. python 保存文件 吃内存_孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化...

    孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...

  3. Python自学笔记6:实操案例三(十进制转换二、八、十六进制),手机充值,计算能量消耗,预测未来子女身高

    Python自学笔记6:实操案例三(十进制转换二.八.十六进制),手机充值,计算能量消耗,预测未来子女身高 杨淑娟老师网课传送门(非广告):https://www.bilibili.com/video ...

  4. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  5. python多久学会自学-python自学多久

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 前言python现在非常火,语法简单而且功能强大,很多同学都想学pyth ...

  6. 免费学python的网站-python自学网站

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 继上一篇「python自学之路-序」之后,决定开始零基础学习python ...

  7. python可以自学吗-python自学行吗

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! { system.out.println(helloworld!); }}pyth ...

  8. python自学网站有哪些-Python自学之路-前期准备

    继上一篇「Python自学之路-序」之后,决定开始零基础学习Python了,今天花了点时间去系统的了解下Python,同时也找了一些相关的教程,这里分享给大家. (一)Python可以做什么 1.各式 ...

  9. 自学python用什么书-python自学用什么书

    俗话说:工欲善其事,必先利其器!对于零基础入门的人来说,对于Python的学习还是有点懵懵懂懂的,如果有一些书籍先看看来引导,学起来难度也会减低很多,同时会提高学习者的自信心!今天向推荐这些零基础入门 ...

  10. 自学python还是报班-零基础python自学还是报培训班?

    零基础python自学还是报培训班?如果你是零基础建议报python培训班学习,原因是零基础没有系统的学习路线,自学过程中遇到困难无人解答,参加Python培训班有专业的课程老师指导,同学之间可以互相 ...

最新文章

  1. mysql alter engine_MySQL_mysql下修改engine引擎的方法,修改my.ini,在[mysqld]下加上 - phpStudy...
  2. 冀教版五年级计算机教学计划,冀教版五年级科学教学计划
  3. java简单毕设_计算机毕业设计之自定义毕设课题需要如何确定工作量
  4. B-树、B+树、B*树详解
  5. Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令
  6. c语言系统的通用数据结构,(转载)C语言实现通用数据结构的高效设计
  7. mysql去除内容中的换行和回车
  8. selenium:解决页面元素display:none的方法
  9. 机构、基民双输,基金销售的利益困局如何破?
  10. C++中关于使用while(cin)后,后续代码无法执行问题
  11. mysql好玩的代码_搞一些好玩的东西redis
  12. HTML编辑器-HTML网页表单可视化在线编辑器插件大全
  13. BP神经网络的原理及简单应用
  14. 无插件播放之http-flv
  15. 测试投入度量元的选择
  16. ITSM:免费开源与收费的究竟差别在哪里?
  17. (转载)适合大学生旅游时住的各地旅馆
  18. 纯干货!一款APP从设计稿到切图过程全方位揭秘
  19. jquery日期控件使用,起止时间
  20. Gay another

热门文章

  1. 汇编语言(第四版)(个人复习点)
  2. LoadRunner报错vuser_init.c(18): Error: nca_connect_server: cannot communicate
  3. 清华大学计算机科学学院刘钊,姚 骏-清华大学生命学院
  4. 西直门立交桥的破事儿
  5. ogg是什么文件?ogg怎么转mp3格式?
  6. linux系统中如何打开察看img文件内容
  7. 【计几】平面最短欧氏距离点对题集
  8. Docker Registry搭建私有镜像仓库(干货)http/https
  9. 〖Python接口自动化测试实战篇⑥〗- 接口抓包工具 Chrome 的使用
  10. 输入半径 求球的表面积和体积