【Python】torrentParser1.03
#------------------------------------------------------------------------------------ # torrentParser1.03,用于解析torrent文件 # 修改了函数getStructure,增加其节点值显示 # 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 getFilepathname(self): return self.filePathname # 得到所有键值 def getKeys(self): return self.fileDic.keys() # 得到全部内容 def getAllContent(self): return self.fileDic; # 得到文件结构 def getStructure(self): retval='' layer=0 for key in self.fileDic.keys(): value=self.fileDic[key] retval=retval+self.getNextNode(key,value,layer) return retval # 向下递归查找文件结构, def getNextNode(self,key,value,layer): retval=""; layer+=1 if type(value)==type({}) and len(value.keys())>0: for i in range(1,layer+1): retval=retval+"\t" retval=retval+str(key)+"\n" for k in value.keys(): v=value[k] retval=retval+ self.getNextNode(k,v,layer) elif type(value)==type([]) and len(value)>0: for i in range(1,layer+1): retval=retval+"\t" retval=retval+str(key)+"\n" arr=value for it in arr: if type(it)==type({}) and len(it.keys())>0: for nk in it.keys(): nv=it[nk] retval=retval+''+self.getNextNode(nk,nv,layer) else: for i in range(1,layer+1): retval=retval+"\t" showValue=str(value)[0:50] # 显示的值 retval=retval+str(key)+":"+showValue+"\n" return retval # 获得tracker服务器的URL def getAnnounce(self): if 'announce' in self.fileDic: return self.fileDic['announce'].decode('utf-8','ignore') 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','ignore')) else: retval.append(childArr.decode('utf-8','ignore')) 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','ignore') 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','ignore') # 获得备注(可选项) def getComment(self): if 'comment' in self.fileDic: return self.fileDic['comment'].decode('utf-8','ignore') return '' # 获得创建者(可选项) def getCreatedBy(self): if 'created by' in self.fileDic: return self.fileDic['created by'].decode('utf-8','ignore') return '' # 多文件的情况下,得到多个文件的个数 def getFileCount(self): return len(self.fileDic['info']['files']) # 多文件的情况下,获得所有文件 def getFiles(self): files=[] for item in self.fileDic['info']['files']: file={} for key in item.keys(): value=item.get(key) if key=='path': #print('1.'+str(value)) #print('10.'+str(value[0])) path=value[0].decode('utf8','ignore') value=path if key=='path.utf-8': #print('2.'+str(value)) #print('20.'+str(value[0])) path=value[0].decode('utf8','ignore') value=path file[key]=value files.append(file) return files # 单文件情况下,取文件名 def getSingleFileName(self): return self.getTitle(); # 单文件情况下,取文件长度 def getSingleFileLength(self): return self.fileDic['info']['length'] # 单文件情况下,取文件md5sum def getSingleFileMd5sum(self): if 'md5sum' in self.fileDic['info']: return self.fileDic['info']['md5sum'].decode('utf-8','ignore') 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+"\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='./8.torrent') print('文件名='+tp.getFilepathname()) print('文件结构:\n'+tp.getStructure()) print('文件简报:\n'+str(tp.getBrief())) print('文件内容:\n'+str(tp.getAllContent())) # Start main()
2018年5月9日
【Python】torrentParser1.03的更多相关文章
- 【Python】torrentParser1.04 增加获得磁力链URI功能
代码: #------------------------------------------------------------------------------------ # torrentP ...
- 【Python】torrentParser1.01
在昨天的版本上做了一些改进,如增加getAll,修改getSingleFileName等 代码: #-------------------------------------------------- ...
- 【Python】torrentParser1.00
代码: #------------------------------------------------------------------------------------ # torrentP ...
- 【Python】torrentParser1.02
#------------------------------------------------------------------------------------ # torrentParse ...
- 【python】列出http://www.cnblogs.com/xiandedanteng中所有博文的标题
代码: # 列出http://www.cnblogs.com/xiandedanteng中所有博文的标题 from bs4 import BeautifulSoup import requests u ...
- 【python】redis基本命令和基本用法详解
[python]redis基本命令和基本用法详解 来自http://www.cnblogs.com/wangtp/p/5636872.html 1.redis连接 redis-py提供两个类Redis ...
- 【python】下载中国大学MOOC的视频
[python]下载中国大学MOOC的视频 脚本目标: 输入课程id和cookie下载整个课程的视频文件,方便复习时候看 网站的反爬机制分析: 分析数据包的目的:找到获取m3u8文件的路径 1. 从第 ...
- 【python】M3U8下载器脚本
[python]M3U8下载器脚本 脚本目标: 1. 输入M3U8文件的链接,得到视频 2.使用异步操作,这样可以快很多,不加锁,因为懒得写,而且影响不大 已知条件: 1.m3u8文件其实就是一个记录 ...
- 【Python②】python之首秀
第一个python程序 再次说明:后面所有代码均为Python 3.3.2版本(运行环境:Windows7)编写. 安装配置好python后,我们先来写第一个python程序.打开IDLE (P ...
随机推荐
- AN2820 Driving bipolar stepper motors using a medium-density STM32F103xx microcontroller
AN2820 Driving bipolar stepper motors using a medium-density STM32F103xx microcontroller Introductio ...
- Go Session 使用简介
6.session和数据存储 6.1 session和cookie 6.2 Go如何使用session 6.3 session存储 6.4 预防session劫持 6.5 小结
- 提高你的Java代码质量吧:谨慎包装类型的比较
一.分析 基本类型可以比较大小,其所对应的包装类型都实现了Comparable接口此问题. 二.场景 代码如下: public class Client{ public static void m ...
- Lucene 3.0 输出相似度
http://www.cnblogs.com/ibook360/archive/2011/10/19/2217638.html Lucene3.0之结果排序(原理篇) 传统上,人们将信息检索系统返回结 ...
- delphi 实现文件上传下载
unit UpDownFile; interface uses Windows, Classes, Idhttp, URLMon, IdMultipartFormData; const UpUrl = ...
- FieldExists
import arcpy import os import sys def FieldExists(TableName,FieldName): desc = arcpy.Describe(TableN ...
- git合并的时候,冲突问题Merging is not possible because you have unmerged files
在做项目工作的时候,同事修改了代码一个cpp代码,我同样也修改了代码,两人代码冲突了,提交之后,他代码git自动合并,并提示: [master| MERGEING]$ git merge my_new ...
- 每天定时备份mysql数据库任务
需求: 1,每天4点备份mysql数据: 2,为节省空间,删除超过3个月的所有备份数据: 3,删除超过7天的备份数据,保留3个月里的 10号 20号 30号的备份数据: #创建shell文件 vim ...
- 破产姐妹第一季/全集2 Broke Girls迅雷下载
本季2 Broke Girls Season 1 (2011)看点:黑发泼辣的Max(凯特·戴琳斯 Kat Dennings 饰)在纽约布鲁克林区一家低档餐馆打工,餐馆同事包括小个子亚裔老板Han L ...
- Android中获取屏幕长宽的方法
package com.kale.screen; import android.annotation.SuppressLint; import android.app.Activity; import ...