[Python] seek使用 bytes转int 浮点特定位数

最近用python写了个计算pcm平均RMS幅度(dBfs)的脚本,其中不少小细节在此列一下

1、python没有跟C一样拿到参数个数的argc,需要使用len(sys.argv)拿到
2、seek第一个参数为offset,第二个为偏移位置 0-file start, 1-current,2-file end
3、python一个除“/”结果为浮点,即使可以整除,“//”为取整
4、‘rb’读文件拿到的数据为bytes类型,如果要转成int需要int.from_bytes方法,可以设置大小端跟有无符合。
5、浮点特定位数打印 print(“%.2f”% num);

if len(sys.argv) != 2: #there is no ARGC
print(“param must be 2”)
exit(0)

with open(sys.argv[1], ‘rb’) as fd:
    cnt = fd.seek(0,2)#2-seek to the end
    cnt = cnt//2 #use // here, other wise cnt is a float
fd.seek(0,0) #0-seek to start
for i in range(cnt):
num = fd.read(2)
        num=int.from_bytes(num, byteorder=”little”, signed=”True”)# byte to int
total += (num*num)
dbfs=20*math.log10(math.sqrt(total/cnt)/32768)+3.013
print(“%.2f”% dbfs); #to keep 2 decimal points

[PYTHON]Python中的函数可变参数


首先看一个示例

def testfunc(*a, **b):

这可不是类似C语言传入指针的函数,这是python中可变参数的表示,

*a表示可变参数,传入的类型为tuple

**b传入的类型为dict

>>> def testfunc(a, *b):

…     print(a)

…     print(b)

>>> testfunc(10, 15, 22, 40,100)

10

(15, 22, 40, 100)

可以看出,a只接收一个参数,剩下的均为b接收,如果我们打印出type(b)的话,会发现b为tuple类型。

**表示可变参数作为一个dict类型传入,既然是dict类型,调用就需要遵循特定的规则。

>>> def testfunc(a, **b):

…     print(a)

…     print(b)

>>> testfunc(10,c=100,d=150)

10

{‘d’: 150, ‘c’: 100}

 

需要注意的是:

  • 一个函数内不能同时出现两个tuple可变参数或者同时出现两个dict可变参数,如下列代码会报错:

 def test(**a, **b): 或者  def test(*a, *b):

  • 一个函数内可以同时存在一个tuple可变参数和一个dict可变参数,但是tuple可变参数在函数定义时必须在前面如
    def test(*a, **b):
    反之如果这样定义def test(**a, *b):则会出错。