一文搞懂:【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:


相关文章
|
4月前
|
SQL 分布式计算 算法
【python】python指南(二):命令行参数解析器ArgumentParser
【python】python指南(二):命令行参数解析器ArgumentParser
48 0
|
6月前
|
设计模式 测试技术 Python
Python教程:一文了解PageObject模式
PageObject 模式通常用于 Web 应用程序的 UI 自动化测试,尤其是在使用 Selenium、Appium 、Airtest等工具进行测试时非常有效。但是,它并不局限于特定类型的应用或工具,而是一种通用的设计模式,可以用于任何需要进行 UI 自动化测试的场景。
112 5
|
Python
【从零学习python 】17. Python字符串的format方法(二)
【从零学习python 】17. Python字符串的format方法(二)
67 0
|
Python
【从零学习python 】16. Python字符串的format方法(一)
【从零学习python 】16. Python字符串的format方法(一)
96 0
|
Python 容器
|
12月前
|
Python
Python3 一行代码列出所有built-in内建函数及用法,比“史上最全”还要全!
Python3 一行代码列出所有built-in内建函数及用法,比“史上最全”还要全!
66 0
Python3 一行代码列出所有built-in内建函数及用法,比“史上最全”还要全!
|
Python
Python的OptionParser模块教程
Python的OptionParser模块教程
140 0
|
分布式计算 Ubuntu Hadoop
Spark编程基础(Python版)
新手入门级Spark编程基础
1243 2
Spark编程基础(Python版)
|
存储 设计模式 索引
python argparse 源码阅读
http.server 可以使用 -h 查看帮助。这种自定义的命令行工具对用户使用程序非常有帮助,我们一起学习是如何实现命令工具的。
190 0
|
Python
【Python面试】 说说Python中pass的作用?
最近公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
124 0
【Python面试】 说说Python中pass的作用?