python爬虫教程

python爬虫教程:http://python.jobbole.com/81332/ 廖雪峰博客:http://www.liaoxuefeng.com/
阅读全文

python修改mp3标题

很多时候,我们从互联网下载过来的MP3是没有标题的,很烦燥,特意弄了个程序,Mark一下!  # coding:utf-8 def ModifyMp3FileInfo(filename):     mp3Id3V1 = {         "tag": {"valuepos": (0, 3), "value": ""},         "SongName": {"valuepos": (3, 33), "value": ""},         "SongPeople": {"valuepos": (33, 63), "value": ""},         "Zj": {"valuepos": (63, 93), "value": ""},         "Year": {"valuepos": (93, 97), "value": ""},         "Bak": {"valuepos": (97, 125), "value": ""}     }     try:         import os         if not os.path.exists(filename):             print 'File not exists:' + filename             return         f = open(filename, 'rb')         f.seek(-128, 2)         sdata = f.read(3)         if sdata == 'TAG':             f.seek(-128, 2)             sdata = f.read(128)             for tag, subitem in mp3Id3V1.items():                 subitem = sdata.replace('\00', '').strip()                 print '%s=' % tag, '%s' % subitem, '\n'             f.close()                          if mp3Id3V1 != '':                 test =                  test.append(mp3Id3V1)                 test.append('.mp3')                 newfilename = ''.join(test)                 print newfilename                 if os.path.exists(newfilename):                     test =                      print ''.join(test)                 else:                     try:                         os.rename(filename, newfilename)                     except WindowsError, e:                         if e.winerror:                             print 'Modify filename failed ,maybe the file is inuse'                         else:                             print 'UnKnown error'         else:             print 'Is not a MP3 file'     except IOError:         print 'Open file failed' if __name__ == '__main__':     ModifyMp3FileInfo('d:\\123.mp3')  
阅读全文

Simple network agent — writen by python

1、从语言的选择方向来说,因为我目的是要方便生活使用,希望能快速达到目的,如果用C和C++来说,工作量稍大些,于是选择了我还算熟悉的python语言 2、里面比较有意思的是在于数据的转发,代理既要承担“送出去”的任务,也要承担“送回来”的任务,思考了下数据结构的使用,使用了字典的方式,即client->forward,forward->client,如果用C来实现的话,就是封装一个结构体,里边有客户端连接的socket,也有传送回来的forward sokcet 3、一旦接收到有客户端连接代理程序,代理程序马上向要转发的目的机器进行TCP连接的建立,同时将双方的socket信息成对保存在字典中 4、采用简单的select模型,主要是图个便利,当有活动的socket连接时,能马上检测到socket句柄的活动,从而从字典中找到对应的socket连接信息 总结:既然选择了写程序,碰到看不顺手,或操作麻烦的事情,就来个程序终结它,Orz! 技术没有所谓最好的语言,语言只是工具,但要用好,别伤了自己,在合理的事情上选择对的工具,让那些争论PHP是最好的语言的人浪费时间去吧。最后:上程序!!叮叮叮! #coding=utf-8 import socket import select import sys import threading import time import logging import os logsDir = "logs" #目录不存在则创建 if not os.path.isdir(logsDir):     os.mkdir(logsDir) #记录日志 logging.basicConfig(level=logging.DEBUG,                 format='%(asctime)s %(filename)s %(levelname)s %(message)s',                 datefmt='%a, %d %b %Y %H:%M:%S',                 filename='logs/logs.log',                 filemode='a') #C的IP和端口 to_addr = () #最大连接数 maxConnetions = 32 class Proxy:     def __init__(self, addr):         self.proxy = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         self.proxy.bind(addr)         self.proxy.listen(maxConnetions)         self.inputs = {self.proxy:None}         self.route = {}     def serve_forever(self):         logging.info('proxy listen...')         while 1:             readable, _, _ = select.select(list(self.inputs.keys()), , )             for self.sock in readable:                 if self.sock == self.proxy:                     self.on_join()                 else:                     try:                         data = self.sock.recv(8192)                     except Exception, e:                         logging.error(str(e))                         self.on_quit()                         continue                     if not data:                         self.on_quit()                     else:                         try:                             self.route.send(data)                         except Exception, e:                             logging.error(str(e))                             self.on_quit()                             continue     def on_join(self):         client, addr = self.proxy.accept()         logging.info("proxy client " + str(addr) + 'connect')         forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM)         try:             forward.connect(to_addr)         except Exception, e:             logging.error(str(e))             client.close()             return         self.inputs  = None         self.inputs  = None         self.route = forward         self.route = client     #删除连接     def on_quit(self):         ls =          if self.sock in self.route:             ls.append(self.route)         for s in ls:             if s in self.inputs:                 del self.inputs             if s in self.route:                 del self.route             s.close() if __name__ == '__main__':     proxy = Proxy(('',54321))     try:                  with open('proxy.conf',"r") as fd:             info_list = fd.readline().split(',')             to_addr = (info_list,int(info_list))             print to_addr                  proxy.serve_forever()#代理服务器监听的地址     except KeyboardInterrupt:         sys.exit(1) 最后,我用pyinstaller生成了一个可执行的二进制程序,使用说明都在里边了 简单的网络代理工具(附使用说明和python源码)
阅读全文

python操作excel

一、安装xlrd模块    到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。     xlrd模块暂时只支持2007以下的版本写操作,读操作的话,经过测试,2013版本都支持 二、使用介绍   1、导入模块       import xlrd    2、打开Excel文件读取数据        data = xlrd.open_workbook('excelFile.xls')    3、使用技巧         获取一个工作表         table = data.sheets()          #通过索引顺序获取           table = data.sheet_by_index(0) #通过索引顺序获取         table = data.sheet_by_name(u'Sheet1')#通过名称获取           获取整行和整列的值(数组)              table.row_values(i)            table.col_values(i)           获取行数和列数            nrows = table.nrows           ncols = table.ncols                 循环行列表数据         for i in range(nrows ):       print table.row_values(i)   单元格 cell_A1 = table.cell(0,0).value   cell_C4 = table.cell(2,3).value   使用行列索引 cell_A1 = table.row(0).value   cell_A2 = table.col(1).value   简单的写入 row = 0   col = 0   # 类型 0 empty,1 string, 2 number, 3 date,...
阅读全文
Python

python中的日志模块logging

先上码:import logging import sys import time,os logfile = os.path.basename(sys.argv) + '-' + time.strftime("%Y%m%d")  + '.log' print logfile logging.basicConfig(level=logging.DEBUG,                 format='%(asctime)s %(filename)s %(levelname)s %(message)s',                 datefmt='%Y-%m-%d %H:%M:%S',                 filename=logfile,                 filemode='w') logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message') 再上图: 最后再解释logging.basicConfig函数各参数: filename: 指定日志文件名 filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a' format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示: %(levelno)s: 打印日志级别的数值 %(levelname)s: 打印日志级别名称 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数 %(lineno)d: 打印日志的当前行号 %(asctime)s: 打印日志的时间 %(thread)d: 打印线程ID %(threadName)s: 打印线程名称 %(process)d: 打印进程ID %(message)s: 打印日志信息 datefmt: 指定时间格式,同time.strftime() level: 设置日志级别,默认为logging.WARNING stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略   更多参考:http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html
阅读全文