一文搞懂:【Python】torrentParser1.01

简介: 一文搞懂:【Python】torrentParser1.01

在昨天的版本上做了一些改进,如增加getAll,修改getSingleFileName等


代码:


#------------------------------------------------------------------------------------


# torrentParser1.01,用于解析torrent文件


# 2018年5月9日


#------------------------------------------------------------------------------------


from bencode import bdecode


import time


#-------------------------------------


# torrentParser类


#-------------------------------------


class torrentParser(object):


# 构造函数


def init(self,filePathname):


self.filePathname=filePathname


with open(filePathname,'rb') as fObj:


self.fileDic=bdecode(fObj.read())


# 得到所有键值


def getKeys(self):


return self.fileDic.keys()


# 得到全部内容


def getAll(self):


return self.fileDic;


# 获得tracker服务器的URL


def getAnnounce(self):


if 'announce' in self.fileDic:


return self.fileDic【'announce'】.decode('utf-8')


return ''


# 获得tracker服务器的URL列表


def getAnnounceList(self):


retval=【】


if 'announce-list' in self.fileDic:


arr=self.fileDic【'announce-list'】


for childArr in arr:


if type(childArr)==type(【】):


for item in childArr:


retval.append(item.decode('utf-8'))


else:


retval.append(childArr.decode('utf-8'))


return retval


# 得到制作日期


def getCreateTime(self):


if 'creation date' in self.fileDic:


unixTimestamp=self.fileDic【'creation date'】


firmalTime = time.localtime(unixTimestamp)


dt = time.strftime('%Y-%m-%d %H:%M:%S', firmalTime)


return dt


else:


return ''


# 获得编码方式


def getEncoding(self):


if 'encoding' in self.fileDic:


return self.fileDic【'encoding'】.decode('utf-8') #去掉字符串前面的b'


return ''


# 是否包含多个文件


def hasMultiFiles(self):


if 'files' in self.fileDic【'info'】:


return True


else:


return False


# 获得文件名


def getTitle(self):


arr=【】


info = self.fileDic【'info'】


if 'name.utf-8' in info:


arr=info【'name.utf-8'】


else:


arr = info【'name'】


#print(str(arr))


return arr.decode('utf-8') # \x 开头编码的数据解码成中文


# 获得备注(可选项)


def getComment(self):


if 'comment' in self.fileDic:


return self.fileDic【'comment'】.decode('utf-8')


return ''


# 获得创建者(可选项)


def getCreatedBy(self):


if 'created by' in self.fileDic:


return self.fileDic【'created by'】.decode('utf-8')


return ''


# 多文件的情况下,得到多个文件的个数


def getFileCount(self):


return len(self.fileDic【'info'】【'files'】)


# 多文件的情况下,获得所有文件,返回为:dic


def getFiles(self):


files=【】


for item in self.fileDic【'info'】【'files'】:


file={}


for key in item.keys():


value=item.get(key)


if key=='path':


path=value【0】.decode()


value=path


if key=='path.utf-8':


path=value【0】.decode()


value=path


file【key】=value


files.append(file)


return files


# 单文件情况下,取文件名


def getSingleFileName(self):


#print(str(self.fileDic【'info'】【'name'】))


#return str(self.fileDic【'info'】【'name'】,'utf-8')


return self.getTitle();


# 单文件情况下,取文件长度


def getSingleFileLength(self):


return self.fileDic【'info'】【'length'】


# 单文件情况下,取文件md5sum


def getSingleFileMd5sum(self):


if 'md5sum' in self.fileDic【'info'】:


return str(self.fileDic【'info'】【'md5sum'】,'utf-8')


else:


return ''


# 单文件情况下,取文件长度


def getSingleFilePieceLength(self):


return self.fileDic【'info'】【'piece length'】


# 单文件情况下,取文件pieces


def getSingleFilePieces(self):


return self.fileDic【'info'】【'pieces'】


# 得到文件简报


def getBrief(self):


retval=""


retval=retval+"File:"+self.filePathname+"\n"


retval=retval+"announce:"+self.getAnnounce()+"\n"


arr=self.getAnnounceList()


if(len(arr)>0):


retval=retval+"announce list:"+"\n"


for it in arr:


retval=retval+"\t"+it+"\n"


retval=retval+"Create time:"+self.getCreateTime()+"\n"


retval=retval+"Ecoding:"+self.getEncoding()+"\n"


retval=retval+"Title:"+self.getTitle()+"\n"


retval=retval+"Comment:"+self.getComment()+"\n"


retval=retval+"Created by:"+self.getCreatedBy()+"\n"


hasMulti=self.hasMultiFiles()


retval=retval+"has multi files:"+str(hasMulti)+"\n"


if hasMulti==True:


retval=retval+"【多文件结构】"+"\n"


retval=retval+"包含文件个数为:"+str(self.getFileCount())+"\n"


//代码效果参考:http://hnjlyzjd.com/xl/wz_25474.html

retval=retval+"Files:"+"\n"

files=self.getFiles();


index=1


for item in files:


retval=retval+"\tfile#"+str(index)+"\n"


for key in item.keys():


value=item.get(key)


retval=retval+"\t\t"+str(key)+":"+str(value)+"\n"


retval=retval+"\n"


index=index+1


else:


retval=retval+"【单文件结构】"+"\n"


retval=retval+"文件名为:"+self.getSingleFileName()+"\n"


retval=retval+"文件长度:"+str(self.getSingleFileLength())+"byte\n"


retval=retval+"文件md5sum:"+self.getSingleFileMd5sum()+"\n"


retval=retval+"文件块长度:"+str(self.getSingleFilePieceLength())+"byte\n"


return retval


#-------------------------------------


# 入口


#-------------------------------------


def main():


tp=torrentParser(filePathname='./5.torrent')


#print(tp.getBrief());


print(str(tp.getAll()));


# Start


main()


对只包含一个文件的torrent文件分析情况:


C:\Users\horn1\Desktop\python\40-torrentParser>python torrentParser.py


File:./5.torrent


announce:


announce list:


相关文章
|
SQL 前端开发 JavaScript
Python学习笔记403
Python GUI编程(Tkinter)
|
前端开发 Python
Python学习笔记494
Python 练习实例
|
SQL 关系型数据库 MySQL
Python学习笔记363
Python 操作 MySQL 数据库
Python学习笔记55
Python 条件语句

相关实验场景

更多