写在前面
开发工具:pycharm
python 版本:2.7
需求:将很多的wav或pcm文件,通过给定的网址,进行语义解析,然后将结果按照指定的json格式进行保存输出,可以的话考虑性能,比方说给定1万个文件的情况。
需要导入的模块
import os
#json相关
import json
#线程池
import threadpool
#请求相关
import requests
#正则相关
import re
#声明的全局变量
filesResult = []
threadPollCount = 10
resultJsonData = []
复制代码
文件遍历
def showFileTree(path):
for root, dirs, files in os.walk(path, topdown=False):
print "root", to_unicode(root)
print "dir", dirs
# addFilePath(to_unicode(root), files, "wav|pcm")
# filterFile(to_unicode(root),files,"wav")
# filesResult.append(files)
复制代码
正则匹配
def addFilePath(rootpath, files, postfix):
for file in files:
# print rootpath+os.path.sep + file
pattern = re.compile(postfix)
if pattern.findall(file):
filesResult.append(rootpath + os.path.sep + file)
复制代码
多线程请求
def startThreadPool(filesPath):
# filesPath 应该是一个集合,文件路径的集合
# 我需要做的是将文件路径取出来,放到每一个线程池所需要的参数里面
file_list = []
for file in filesResult:
temp = ([file], None)
file_list.append(temp)
pool = threadpool.ThreadPool(threadPollCount) # 相当于创建线程
# makeRequests参数的含义:第一个参数为目标函数为线程需要执行的具体函数,
# 第二个参数为集合,其中里面存放list和map,第一个为list,第二个为map,表明第一个参数需要用到的参数,比方说这里requestNet函数需要一个参数
requestss = threadpool.makeRequests(requestNet, file_list) #相当于是将线程池与调用的函数相绑定,
[pool.putRequest(req) for req in requestss]
pool.wait()
复制代码
request请求
def requestNet(file):
url = "http://48.haitou.cc:50080/asr-test/recognize"
files = {'audioData': open(file, 'rb')}
res = requests.post(url, files=files)
showJsonData(file, res.text)#这里注意是res.text从而获取到返回的内容
复制代码
json解析
#json格式{"state": "OK", "code": 0, "result": {"text": "小杜小杜", "code": 1}}
def showJsonData(filepath, res):
text = json.loads(res)
# print to_unicode(filepath + "对应的结果是:"),
print filepath,
print "对应的结果是:",
err = 0
if text['state'] == "OK":
print text['result']['text']
err = 0;
else:
print text['state']
err = -1
#保存数据
# 需要 进行裁剪
resultFile = filepath[filepath.rindex("\\")+1:]
jsonResult = {
"mText": to_unicode(text['result']['text']).encode("utf-8"),
"fileName": to_unicode(resultFile).encode("utf-8"),
"errCode": err,
"engineName": "引擎名称"
}
resultJsonData.append(jsonResult)
复制代码
json写入文件
def writeData(data):
# {
# "mText": 识别结果,
# "fileName": 处理的音频的名字,
# "errCode": 错误码,
# "engineName": 引擎的名字
# }
# 写文件
resultFile = open(resultFileName, 'w') #每次都会覆盖之前的文件
json_str = json.dumps(data,ensure_ascii=False) #这里注意ensure_ascii =Flase
print json_str
resultFile.write(json_str)
resultFile.close()
复制代码
字符编码
def to_unicode(string):
if isinstance(string, unicode):
return string
try:
string_uni = string.decode("UTF-8")
return string_uni
except UnicodeDecodeError:
pass
复制代码
执行
def main():
# wavSrcPath = raw_input("target:")
# print wavSrcPath
wavSrcPath = "C:\\Users\\telen\\Desktop\\python脚本"
showFileTree(to_unicode(wavSrcPath))
# print "+++++++++++++++++"
# showFile(filesResult)
startThreadPool(filesResult)
writeData(resultJsonData)
复制代码
FAQ
- 怎么安装request?
pip install threadpool
- 怎么安装pip?
python "D:\Program Files\python2.7\Lib\requests-2.4.3\setup.py" install 找到相应的setup.py 即可安装,有了这个之后我终于知道怎么用github上面的python项目了。原来都有setup.py 只要找到相应的setup.py就可以用了。 表示我以前真的不知道,怎么用github上面的项目到自己的工程里面。
- 不懂怎么改字符编码? 请看这里