1. 程式人生 > 其它 >如何用PYTHON統計固話來電情況(三)

如何用PYTHON統計固話來電情況(三)

這篇的目的只有一個,那就是找出錄音檔案中的資訊,來電及時間等這些資訊到底藏哪裡了。
首先我想到的可能是直接用檔名的形式,但是很遺憾,檔名就是數字序號,並沒有其他資訊,然後我想到的就是利用音訊檔案的表演者,專輯等資訊,右鍵屬性查看了一下也沒有,最後試著用Ulrtaedit打開了一下,果然發現了玄機,原來啊直接就存在這裡了,音訊檔案是有個類似標頭檔案資訊的,在第100h行寫入了資訊,如圖
在這裡插入圖片描述直接用16進製表示出來了,再對照用自帶軟體的資訊,很開就搞懂了每個字元的意思。
下面開始著手提取資訊,用二進位制開啟WAV檔案,找到地址,但是再怎麼顯示成上圖的樣子這裡我卡了一個多小時,最後終於在網上找到了關鍵的一句!

b = hex(int.from_bytes(a, byteorder=sys.byteorder))

就這麼簡單的一句我找得好辛苦!
其他的都是日常操作了,貼上程式碼

#-*-coding:gb2312-*-
import sys
import os
import time
import wave
import json
from pymediainfo import MediaInfo
import csv

file_dir=os.getcwd()
filelist=[]
for root, dirs, files in os.walk(file_dir):
    for f in files:
        if f[-4:]=='.WAV':
            filelist.append(f)
print(filelist)

def get_media_info(media_name):
    media_info = MediaInfo.parse(media_name)
    media_data = json.loads(media_info.to_json())["tracks"]
    timeslast=int(media_data[0]['duration']/1000)
    return timeslast

def getdata(filename):
    file = open(filename, 'rb')
    numberadd = [257, 258, 259]
    dayadd = [265, 266, 267]
    timeadd = [268, 269, 270]
    typeadd = 271
    number = []
    day = []
    time = []

    for i in numberadd:
        file.seek(i)
        a = file.read(1)
        b = hex(int.from_bytes(a, byteorder=sys.byteorder))
        c = b[2:4]
        number.append(c)
        phonenumber = ''.join(number)

    for i in dayadd:
        file.seek(i)
        a = file.read(1)
        b = hex(int.from_bytes(a, byteorder=sys.byteorder))
        c = b[2:4]
        day.append(c)
        days = '-'.join(day)

    for i in timeadd:
        file.seek(i)
        a = file.read(1)
        b = hex(int.from_bytes(a, byteorder=sys.byteorder))
        c = b[2:4]
        time.append(c)
        times = ':'.join(time)

    file.seek(typeadd)
    a = file.read(1)
    b = hex(int.from_bytes(a, byteorder=sys.byteorder))
    c = b[2:4]
    if c == '5':
        types = 'B'
    elif c == '2':
        types = 'Z'
    else:
        types=0

    timelast=get_media_info(filename)
    file.close()
    datalist=[filename,phonenumber, days, times, types,timelast]
    print(datalist)
    return datalist

f = open('data.csv','a+',newline='')
cw = csv.writer(f)
cw.writerow(['檔名','電話號碼','日期','時間','型別','時長'])
for f in filelist:
    try:
        cw.writerow(getdata(f))
    except:
        pass

終於搞定了,最後就剩下資料分析畫圖了,正好複習一下PANDAS的相關知識,等我攢夠一個月資料了就繼續!