我又回来了另一个python查询。我一直试图用列表中的项目进行一些计算。这是代码:
import math
def Usage() :
print "Usage :python beznew.py transcriptionsFile"
if __name__ == "__main__" :
if len(sys.argv) != 2 :
Usage()
else :
transcriptionFile = sys.argv[1]
tFile = open(transcriptionFile, "r")
for line in iter(tFile) :
list = line.split()
# changing the unit of time from 100 nano seconds to seconds
list[0] = list[0] / 100000000
list[1] = list[1] / 100000000
# duration of each phoneme
list = list[1] - list[0]
# extracting the start time of each phoneme
newlist = list.pop[0]
print list
print newlist
close.tFile
输入文件如下所示:
000000 1200000 pau
1200000 1600000 dh
1600000 2000000 ih
2000000 3100000 k
3100000 3400000 aa
3400000 3800000 r
我正在尝试将数值更改为秒。并且还试图获得第一个和第二个数字之间的差异。它不允许我划分。我不明白我做错了什么。谢谢。
答案 0 :(得分:5)
首先,不要将list
用作变量名。每当你这样做,一只小猫就会死去。
其次,如果您重视精度,则应将从文件中提取的字符串转换为数字,最好是Decimal
。目前你正试图划分一个字符串。
第三,纳秒是十亿分之一秒,而不是百万分之一。
第四,它是tFile.close()
,而不是close.tfile
。
第五,使用for line in tfile:
。文件描述符已经是迭代器。
第六,使用with open(transcriptionfile, "r") as tfile:
并完成必须关闭它。
答案 1 :(得分:1)
line.split()
返回字符串列表。试试list[0] = float(list[0]) / 100000000
。
在计算之前,这会将每个字符串转换为支持除法的数字。
答案 2 :(得分:1)
您可以按如下方式简化代码:
transcriptionFile = 'calculus.txt'
with open(transcriptionFile, "r") as tFile:
for line in tFile :
li = line.split()
if li:
new = ((int(li[1]) - int(li[0]))/10000000. , li[2])
print li,' ',new
条件if li:
用于消除可能的空行。
重点:
不要调用名为list
的列表,因为list
是Python内置函数的名称
,10/100
产生0;你必须加点才能获得正确的结果:10./100
或10/100.
在除以10000000之前进行微积分list = list[1] - list[0]
,它更精确
with open(....) as handle:
最好打开文件
我个人会这样做
transcriptionFile = 'calculus.txt'
with open(transcriptionFile, "r") as tFile:
gen = (line.split() for line in tFile if line.strip())
li = [((int(t2)-int(t1))/10000000.,phon) for (t1,t2,phon) in gen]
print '\n'.join(map(str,li))
请注意,我使用10000000来划分:如果1600000 - 1200000 = 400000
的单位为100纳秒,则400000 / 10000000
为0.04秒
transcriptionFile = 'calculus.txt'
with open(transcriptionFile, "r") as tFile:
gen = (line.split() for line in tFile if line.strip())
firstVals, lapTimes = [],[]
for (t1,t2,phon) in gen:
firstVals.append( (int(t1)/10000000.,phon) )
lapTimes.append( (int(t2)-int(t1))/10000000.,phon) )
答案 3 :(得分:0)
您不会将字符串转换为数字值。为了对您的数据进行数学运算,您必须将它们转换为int
或float
个对象:
valueA = int(list[0]) / 100000000
valueB = int(list[1]) / 100000000