代码:

#------------------------------------------------------------------------------------
# torrentParser1.00,用于解析torrent文件
# 2018年5月8日
#------------------------------------------------------------------------------------
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()

    # 获得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:
                for item in childArr:
                    retval.append(item.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):
        filename=''
        info = self.fileDic['info'] 

        if 'name.utf-8' in info:
            filename=info['name.utf-8']
        else:
            filename = info['name']  

        return filename.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)
                #value=value.decode('utf-8');
                file[key]=value

            files.append(file)

        return files

    # 单文件情况下,取文件名
    def getSingleFileName(self):
        return str(self.fileDic['info']['name'],'utf-8')

    # 单文件情况下,取文件长度
    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"
            retval=retval+"Files:"+"\n"

            files=self.getFiles();
            index=1
            for item in files:
                #retval=retval+"\t"+str(item)+"\n"
                retval=retval+"\tfile#"+str(index)+"\n"
                for key in item.keys():
                    value=item.get(key)

                    #if isinstance(value,bytes):
                    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"
            #retval=retval+"文件Pieces:"+str(self.getSingleFilePieces())+"\n"

        return retval

def main():
    tp=torrentParser(filePathname='./1.torrent')
    print(tp.getBrief());

# Start
main()

输出:

C:\Users\horn1\Desktop\python\38-torrentParser>python torrentParser.py
File:./1.torrent
announce:udp://fr33domtracker.h33t.com:3310/announce
announce list:
        udp://fr33domtracker.h33t.com:3310/announce
        http://fr33dom.h33t.com:3310/announce
        udp://tracker.publichd.eu/announce
        http://tracker.publichd.eu/announce
        http://tracker.publicbt.com:80/announce
        http://exodus.desync.com:6969/announce
        http://exodus.desync.com/announce
        http://tracker.prq.to:6969/announce
        http://ipv4.tracker.harry.lu/announce
        udp://tracker.1337x.org:80/announce
        udp://tracker.openbittorrent.com:80/announce
        udp://tracker.ccc.de:80
        udp://tracker.istole.it:80/announce
        udp://10.rarbg.com/announce
Create time:2012-08-27 19:07:23
Ecoding:UTF-8
Title:[dydao.com]The.Mask.of.Love.2012.HDTV.720p.x264.AC3-HD.mkv
Comment:www.dydao.com
Created by:uTorrent/3130
has multi files:False
[单文件结构]
文件名为:[dydao.com]The.Mask.of.Love.2012.HDTV.720p.x264.AC3-HD.mkv
文件长度:4695257841byte
文件md5sum:
文件块长度:8388608byte

2018年5月8日

【Python】torrentParser1.00的更多相关文章

  1. 【Python】torrentParser1.04 增加获得磁力链URI功能

    代码: #------------------------------------------------------------------------------------ # torrentP ...

  2. 【Python】torrentParser1.01

    在昨天的版本上做了一些改进,如增加getAll,修改getSingleFileName等 代码: #-------------------------------------------------- ...

  3. 【Python】torrentParser1.03

    #------------------------------------------------------------------------------------ # torrentParse ...

  4. 【Python】torrentParser1.02

    #------------------------------------------------------------------------------------ # torrentParse ...

  5. 【Python】 零碎知识积累 II

    [Python] 零碎知识积累 II ■ 函数的参数默认值在函数定义时确定并保存在内存中,调用函数时不会在内存中新开辟一块空间然后用参数默认值重新赋值,而是单纯地引用这个参数原来的地址.这就带来了一个 ...

  6. 【python】列出http://www.cnblogs.com/xiandedanteng中所有博文的标题

    代码: # 列出http://www.cnblogs.com/xiandedanteng中所有博文的标题 from bs4 import BeautifulSoup import requests u ...

  7. 【python】Leetcode每日一题-位1的个数

    [python]Leetcode每日一题-位1的个数 [题目描述] 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 示例1 ...

  8. 【Python②】python之首秀

       第一个python程序 再次说明:后面所有代码均为Python 3.3.2版本(运行环境:Windows7)编写. 安装配置好python后,我们先来写第一个python程序.打开IDLE (P ...

  9. 【python】多进程锁multiprocess.Lock

    [python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报  分类: Python(38)  同步的方法基本与多线程相同. ...

随机推荐

  1. android图片的缓存--节约内存提高程序效率

    如今android应用占内存一个比一个大,android程序的质量亟待提高. 这里简单说说网络图片的缓存,我这边就简单的说说思路 1:网络图片,无疑须要去下载图片,我们不须要每次都去下载. 维护一张表 ...

  2. FTP服务器原理(转)

    本文转自https://www.cnblogs.com/Aiapple/p/5955736.html 感谢作者   21.1 FTP服务器原理   使用明码传输方式,且有相当多的安全危机历史.因此一般 ...

  3. ios之快速枚举

    for(UIView * subView in self.view.subviews) { if([subView isKindOfClass:[XYZSeniorQueryView class]]) ...

  4. Informix存储过程

    一.存储过程概述 存储过程是一个用户定义的函数,由存储过程语句(SPL) 和一组SQL语句组成,以可以执行代码形式存储在数据库中,和表.视图.索引等一样,是数据库的一种对象. 存储过程语言SPL(St ...

  5. 关于面试总结1-SQL学生表

    前言 每次面试必考SQL,小编这几年一直吃SQ的亏,考题无非就是万年不变学生表,看起来虽然简单,真正写出来,还是有一定难度.于是决定重新整理下关于SQL的面试题,也可以帮助更多的人过SQL这一关. 作 ...

  6. Java 与 Json的互相转换

    这几天一直在做Java解析Json数据的一个项目,因为初识json,所以很多东西都是有着懵懂的认识.这里写下我解析时遇到的问题和收获. 我解析json时用到的是json-lib包.下载地址:http: ...

  7. spring源代码分析

    预初始化beanDefaultListableBeanFactory preInstantiateSingletons

  8. java 生成zip文件并导出

    总结一下,关于Java下载zip文件并导出的方法,浏览器导出. String downloadName = "下载文件名称.zip"; downloadName = Browser ...

  9. Docker存出载入镜像

    镜像的存出和载入 如果你的生产环境不能连通互联网,而你又希望从互联网上获取镜像.你就需要借助 docker save命令,可以将镜像导出为 tar 文件.使用 docker load 命令,可以将ta ...

  10. Tornado开发技巧,简单了解tornado

    tornado基础入门(一)——简单了解tornado 参考:http://demo.pythoner.com/itt2zh/ch1.html tornado是一个轻量级的web框架,是一个用pyth ...