如何用PYTHON統計固話來電情況(三)
阿新 • • 發佈:2021-01-24
這篇的目的只有一個,那就是找出錄音檔案中的資訊,來電及時間等這些資訊到底藏哪裡了。
首先我想到的可能是直接用檔名的形式,但是很遺憾,檔名就是數字序號,並沒有其他資訊,然後我想到的就是利用音訊檔案的表演者,專輯等資訊,右鍵屬性查看了一下也沒有,最後試著用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的相關知識,等我攢夠一個月資料了就繼續!