python join 和 split的常用使用方法

python join 和 split方法的使用,join用来连接字符串,split恰好相反,拆分字符串的。

1.join用法示例 
>>>li = ['my','name','is','bob'] 
>>>’ ‘.join(li) 
‘my name is bob’ 
 
>>>’_’.join(li) 
‘my_name_is_bob’ 
 
>>> s = ['my','name','is','bob'] 
>>> ‘ ‘.join(s) 
‘my name is bob’ 
 
>>> ‘..’.join(s) 
‘my..name..is..bob’ 
 
2.split用法示例 
>>> b = ‘my..name..is..bob’ 
 
>>> b.split() 
['my..name..is..bob'] 
 
>>> b.split(“..”) 
['my', 'name', 'is', 'bob'] 
 
>>> b.split(“..”,0) 
['my..name..is..bob'] 
 
>>> b.split(“..”,1) 
['my', 'name..is..bob'] 
 
>>> b.split(“..”,2) 
['my', 'name', 'is..bob'] 
 
>>> b.split(“..”,-1) 
['my', 'name', 'is', 'bob'] 
 
可以看出 b.split(“..”,-1)等价于b.split(“..”) 

python中文decode和encode转码

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312′),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312′),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

(与代码本身的编码是一致的!)

测试:
我的eclipse里面代码为utf-8编码的。然后我这样写代码
s=”你好”
s=s.decode(‘gb2312′).encode(‘utf-8′)
print s
报错:
UnicodeDecodeError: ‘gb2312′ codec can’t decode bytes in position 2-3: illegal multibyte sequence
原因:因为我的文件为UTF-8编码的。所以你想用gb2312将其转成unicode是不可能的。
所以正确的写法应当是:
s=”你好”
print s
s=s.decode(‘utf-8′).encode(‘utf-8′) 要用UTF-8来做编码
print s
哈哈发现打印出来的是乱码那只能说明一件事情就是我的eclipse控制台是GB2312的编码!

请看:
如何获得系统的默认编码?
#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()

该段程序在英文WindowsXP上输出为:ascii 。我发现我的linux上面也是ascii编码。所以我想打印出来看到的乱码是正常的。因为我其实是utf-8编码的。

在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。(是的。我的eclipse控制台就是gb2312的编码所以我文件保存为utf-8的时候然后再通过打印是乱码了!)
1、读文件命令肯定是:
myfile = codecs.open(“c.html“,”r”,”utf-8″) 因为我用gb2312来读的话报错

心得:检查一个字符串是什么编码只需要看一下decode 如果用gb2312来decode没报错的话就表示是gb2312
如果用utf-8来decode没有报错的话就表示是utf-8

现在遇到一个问题就是
请看:
myfile = codecs.open(“c.html”,”r”,”utf-8″)
str = myfile.read()                               
content = str.replace(“\n”,” “)  
content = content.encode(‘utf-8′)
print content
没有报错
再看:
myfile = codecs.open(“c.html”,”r”,”utf-8″)
str = myfile.read()                                 #显示中文
content = str.replace(“\n”,” “)  
content = content.encode(‘gb2312′)                 用gb2312
print content
报错:UnicodeEncodeError: ‘gb2312′ codec can’t encode character u’\u2014′ in position 12628

再看:
myfile = codecs.open(“d.html”,”r”,”utf-8″)
str = myfile.read()                                 #显示中文
content = str.replace(“\n”,” “)  
content = content.encode(‘gb2312′)                 用gb2312
print content
没问题
myfile = codecs.open(“d.html”,”r”,”utf-8″)
str = myfile.read()                                 #显示中文
content = str.replace(“\n”,” “)  
content = content.encode(‘utf-8′)                
print content
也没问题

结论:我想是c.html页面里面 存在某些 特殊字符 只支持utf-8编码。而不支持gb2312的编码!
而d.html没有这种特殊字符。这也就解释了为什么
有的文件并没有发生我们想像中的问题!

所以我感觉打开文件肯定是用utf-8来读取得到一个unicode编码值!
然后对其做utf-8的编码处理。因为如果你做gb2312处理的话就会报错了!

接着:
我看了一下我的正则表达式发现如果用gb2312做解码处理的话一样会报错。所以断定肯定是utf-8编码了!
regex3 = regex3.decode(‘utf-8′)
print type(regex3)                #返回为unicode码了!
print regex3                      #居然打印为正常的中文显示了 奇怪

尝试解决办法:
1、全部用unicode处理
即正则我用regex3 = regex3.decode(‘utf-8′) 将其处理成 unicode编码了。然后内容也
print type(content) 也是unicode编码。结果还是不行!

难道是我的linux终端的编码引起的吗?我看了一下
locale 发现是GBK的终端的。即只有GBK编码才能显示出来为中文的!
于是我将
regex3 = regex3.decode(‘utf-8′).encode(‘gb2312′) 编码成gb2312结果可以显示中文!

OK。我又将我的内容也一起弄成GB2312
content = content.encode(‘gb2312′,’ignore’)
print content                 也可以成功打印出来中文。

我想这个时候应该没有什么问题了吧。结果一用正则又死掉了。昏死!!!!!!!

换另外一个好的文件测试下看看:换了之后发现没死而且成功了!

所以我觉得:肯定是这个文件里面的某些内容与正则匹配出现了冲突!导致的!

继续跟踪:
出现如下的情况
myfile = codecs.open(“01.htm”,”r”,”utf-8″,”ignore”)             
str = myfile.read()                              
content = str.replace(“\n”,” “)
print type(content)                               #发现是unicode码
regex3 = ‘class=wpcpsCSS>([^<]+)(?:.*?wpcppb_CSS> ([0-9]+) </span>)?.*?(?:.*?(已被关闭))?.*?([0-9]+)个回答.*?([0-9]+)次浏览.*?(?:<div>.*?user\?userid=([0-9]+).*?>(.*?)</a> </div>.*?)?(?:user\?userid=([0-9]+)”)?]+”>([^<]+).*?class=wpcptsCSS>([^<]+).*?([0-9.]{9,}\*).*?class=wpcpdCSS>(.*?)</div> <div>’
content = content.encode(‘utf-8′)
p=re.compile(regex3)
results = p.findall(content)

没有什么问题可以成功出来结果。但是我
将content = content.encode(‘gb2312′) 的话就发现 死掉了!
说明我的内容content与我的正则的编码其实是不一样的!
我现在将我的正则也调成gb2312来测试。结果发现可以出来。而且我的结果
results = p.findall(content)
for ele in results:
    print ele[0],ele[1],ele[2],ele[3],ele[4],ele[5],ele[6],ele[7],ele[8],ele[9],ele[10]
在eclipse(默认为gb2312)下面也是没有问题的了!~

所以我想:如果content是GBK那正则的内容也应当是GBK 即两者的编码一定要保持一致!否则就会出现死掉程序的情况!

现在我这样来处理
全部使用unicode编码处理

myfile = codecs.open(“right.html”,”r”)   
str = myfile.read()                                
content = str.replace(“\n”,” “)
content = content.decode(‘utf-8′,’ignore’)     #使用utf-8解码出来
都使用unicode编码吧
现在正则也用
regex3 = regex3.decode(‘utf-8′,’ignore’) 使用utf-8搞成unicode编码

OK现在再来测试!

结论:
解决正则出现中文的BUG结论:
1、打开文件
myfile = codecs.open(“right.html”,”r”)
不需要设置其编码的!

设置编码格式
str = myfile.read()                             
content = str.replace(“\n”,” “)
content = content.decode(‘utf-8′,’ignore’)   #使用utf-8解码成unicode格式

正则:
regex3 = regex3.decode(‘utf-8′,’ignore’)    #正则也统一使用utf-8解码成unicode格式

然后就可以
p=re.compile(regex3)
results = p.findall(content)
调用正则了!

Python常见文件操作的函数示例

# -*-coding:utf8 -*- 

 

””’

    Python常见文件操作示例

 

    os.path 模块中的路径名访问函数

    分隔

    basename() 去掉目录路径, 返回文件名

    dirname() 去掉文件名, 返回目录路径

    join() 将分离的各部分组合成一个路径名

    split() 返回(dirname(), basename()) 元组

    splitdrive() 返回(drivename, pathname) 元组

    splitext() 返回(filename, extension) 元组

 

    信息

    getatime() 返回最近访问时间

    getctime() 返回文件创建时间

    getmtime() 返回最近文件修改时间

    getsize() 返回文件大小(以字节为单位)

 

    查询

    exists() 指定路径(文件或目录)是否存在

    isabs() 指定路径是否为绝对路径

    isdir() 指定路径是否存在且为一个目录

    isfile() 指定路径是否存在且为一个文件

    islink() 指定路径是否存在且为一个符号链接

    ismount() 指定路径是否存在且为一个挂载点

    samefile() 两个路径名是否指向同个文件

    

    os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false

    os.path.isfile(name):判断name是不是一个文件,不存在name也返回false

    os.path.exists(name):判断是否存在文件或目录name

    os.path.getsize(name):获得文件大小,如果name是目录返回0L

    os.path.abspath(name):获得绝对路径

    os.path.normpath(path):规范path字符串形式

    os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)

    os.path.splitext():分离文件名与扩展名

    os.path.join(path,name):连接目录与文件名或目录

    os.path.basename(path):返回文件名

    os.path.dirname(path):返回文件路径

         

    

    os模块中的文件操作:

    os 模块属性

    linesep 用于在文件中分隔行的字符串

    sep 用来分隔文件路径名的字符串

    pathsep 用于分隔文件路径的字符串

    curdir 当前工作目录的字符串名称

    pardir (当前工作目录的)父目录字符串名称

    

    1.重命名:os.rename(old, new)

    

    2.删除:os.remove(file)

 

    3.列出目录下的文件:os.listdir(path)

 

    4.获取当前工作目录:os.getcwd()

 

    5.改变工作目录:os.chdir(newdir)

 

    6.创建多级目录:os.makedirs(r”c:\python\test”)

 

    7.创建单个目录:os.mkdir(“test”)

 

    8.删除多个目录:os.removedirs(r”c:\python”) #删除所给路径最后一个目录下所有空目录。

 

    9.删除单个目录:os.rmdir(“test”)

 

    10.获取文件属性:os.stat(file)

 

    11.修改文件权限与时间戳:os.chmod(file)

 

    12.执行操作系统命令:os.system(“dir”)

 

    13.启动新进程:os.exec(), os.execvp()

 

    14.在后台执行程序:osspawnv()

 

    15.终止当前进程:os.exit(), os._exit()

 

    16.分离文件名:os.path.split(r”c:\python\hello.py”) –> (“c:\\python”, “hello.py”)

 

    17.分离扩展名:os.path.splitext(r”c:\python\hello.py”) –> (“c:\\python\\hello”, “.py”)

 

    18.获取路径名:os.path.dirname(r”c:\python\hello.py”) –> “c:\\python”

 

    19.获取文件名:os.path.basename(r”r:\python\hello.py”) –> “hello.py”

 

    20.判断文件是否存在:os.path.exists(r”c:\python\hello.py”) –> True

 

    21.判断是否是绝对路径:os.path.isabs(r”.\python\”) –> False

 

    22.判断是否是目录:os.path.isdir(r”c:\python”) –> True

 

    23.判断是否是文件:os.path.isfile(r”c:\python\hello.py”) –> True

 

    24.判断是否是链接文件:os.path.islink(r”c:\python\hello.py”) –> False

 

    25.获取文件大小:os.path.getsize(filename)

 

    26.*******:os.ismount(“c:\\”) –> True

 

    27.搜索目录下的所有文件:os.path.walk()

 

    shutil模块对文件的操作:

    1.复制单个文件:shultil.copy(oldfile, newfle)

 

    2.复制整个目录树:shultil.copytree(r”.\setup”, r”.\backup”)

 

    3.删除整个目录树:shultil.rmtree(r”.\backup”)

 

    临时文件的操作:

    1.创建一个唯一的临时文件:tempfile.mktemp() –> filename

 

    2.打开临时文件:tempfile.TemporaryFile()

 

    内存文件(StringIO和cStringIO)操作

    [4.StringIO] #cStringIO是StringIO模块的快速实现模块

 

    1.创建内存文件并写入初始数据:f = StringIO.StringIO(“Hello world!”)

 

    2.读入内存文件数据:print f.read() #或print f.getvalue() –> Hello world!

 

    3.想内存文件写入数据:f.write(“Good day!”)

 

    4.关闭内存文件:f.close()

”’ 

import os 

import os.path 

import unittest 

import time 

#import pygame 

 

class PyFileCommonOperatorTest(unittest.TestCase): 

    def __init__(self): 

        “”"constructor”"” 

     

    def test01(self): 

        print os.linesep 

        print os.sep 

        print os.pathsep 

        print os.curdir 

        print os.pardir 

        print os.getcwd() 

        print ‘unittest here’ 

 

 

if __name__ == “__main__”: 

    t = PyFileCommonOperatorTest() 

    t.test01() 

 

 

 

#读文件的写法: 

#读文本文件:  

input = open(‘data’, ‘r’)#第二个参数是默认的,可以不加 

#读二进制文件:  

input = open(‘data’, ‘rb’) 

#读取所有文件内容: 

open(‘xxoo.txt’).read() 

#读取固定字节 

open(‘abinfile’, ‘rb’).read(100) 

#读每行 

file_object.readlines()   

 

作者 scelong

python的一个字典创建程序

来源:素包子

字典的用处非常大,昨天在网上找了个能在linux跑的字典程序,分享一下。
#!/usr/bin/python
f=open(‘wordlist’, ‘w’)
 
def xselections(items, n):
    if n==0: yield []
    else:
        for i in xrange(len(items)):
            for ss in xselections(items, n-1):
                yield [items[i]]+ss
 
# Numbers = 48 – 57
# Capital = 65 – 90
# Lower = 97 – 122
numb = range(48,58)
cap = range(65,91)
low = range(97,123)
choice = 0
while int(choice) not in range(1,8):
    choice = raw_input(”’
    1) Numbers
    2) Capital Letters
    3) Lowercase Letters
    4) Numbers + Capital Letters
    5) Numbers + Lowercase Letters
    6) Numbers + Capital Letters + Lowercase Letters
    7) Capital Letters + Lowercase Letters
    : ”’)
 
choice = int(choice)
poss = []
if choice == 1:
    poss += numb
elif choice == 2:
    poss += cap
elif choice == 3:
    poss += low
elif choice == 4:
    poss += numb
    poss += cap
elif choice == 5:
    poss += numb
    poss += low
elif choice == 6:
    poss += numb
    poss += cap
    poss += low
elif choice == 7:
    poss += cap
    poss += low
 
bigList = []
for i in poss:
    bigList.append(str(chr(i)))
 
MIN = raw_input(“What is the min size of the word? “)
MIN = int(MIN)
MAX = raw_input(“What is the max size of the word? “)
MAX = int(MAX)
for i in range(MIN,MAX+1):
    for s in xselections(bigList,i): f.write(”.join(s) + ‘ ’) 

Python的url编码函数使用的一个小问题

python的url编码函数是在类urllib库中,使用方法是:

编码:urllib.quote(string[, safe]),除了三个符号“_.-”外,将所有符号编码,后面的参数safe是不编码的字符,使用的时候如果不设置的话,会将斜杠,冒号,等号,问号都给编码了。
如下:

>>> import urllib >>> print urllib.quote(“http://neeao.com/index.php?id=1“) http%3A//neeao.com/index.php%3Fid%3D1 这样在使用urllib.urlopen打开编码后的网址的时候,就会报错了。

设置下不编码的符号:

>>> print urllib.quote(“http://neeao.com/index.php?id=1″,”:?=/“)http://neeao.com/index.php?id=1 这下就好了。

python urllib2详解及实例

urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。他以urlopen函数的形式提供了一个非常简单的接口,

这是具有利用不同协议获取URLs的能力,他同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他。

它们通过handlers和openers的对象提供。

 

 

urllib2支持获取不同格式的URLs(在URL的”:”前定义的字串,例如:”ftp”是”ftp:python.ort/”的前缀),它们利用它们相关网络协议(例如FTP,HTTP)

进行获取。这篇教程关注最广泛的应用–HTTP。

 

 

对于简单的应用,urlopen是非常容易使用的。但当你在打开HTTP的URLs时遇到错误或异常,你将需要一些超文本传输协议(HTTP)的理解。

最权威的HTTP文档当然是RFC 2616(http://rfc.net/rfc2616.html)。这是一个技术文档,所以并不易于阅读。这篇HOWTO教程的目的是展现如何使用urllib2,

并提供足够的HTTP细节来帮助你理解。他并不是urllib2的文档说明,而是起一个辅助作用。

 

 

获取 URLs

最简单的使用urllib2将如下所示

 

[python:nogutter] 
import urllib2 
 
response = urllib2.urlopen(‘http://python.org/’) 
 
html = response.read() 
 

urllib2的很多应用就是那么简单(记住,除了”http:”,URL同样可以使用”ftp:”,”file:”等等来替代)。但这篇文章是教授HTTP的更复杂的应用。

 

HTTP是基于请求和应答机制的–客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的

地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。

 

 

[python] 
import urllib2 
 
req = urllib2.Request(‘http://www.voidspace.org.uk’) 
 
response = urllib2.urlopen(req) 
 
the_page = response.read() 
 

 

记得urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。

 

req = urllib2.Request(‘ftp://example.com/’)

 

在HTTP请求时,允许你做额外的两件事。首先是你能够发送data表单数据,其次你能够传送额外的关于数据或发送本身的信息(“metadata”)到服务器,此数据作为HTTP的”headers”来发送。

接下来让我们看看这些如何发送的吧。

 

 

Data数据

有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。在HTTP中,这个经常使用熟知的POST请求发送。这个通常在你提交一个HTML表单时由你的浏览器来做。

并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。编码工作使用urllib的函数而非

urllib2。

 

[python:nogutter] 
import urllib 
 
import urllib2 
 
  
 
url = ‘http://www.someserver.com/cgi-bin/register.cgi’ 
 
values = {‘name’ : ‘Michael Foord’, 
 
          ‘location’ : ‘Northampton’, 
 
          ‘language’ : ‘Python’ } 
 
  
 
data = urllib.urlencode(values) 
 
req = urllib2.Request(url, data) 
 
response = urllib2.urlopen(req) 
 
the_page = response.read() 
 

 

记住有时需要别的编码(例如从HTML上传文件–看http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13 HTML Specification, Form Submission的详细说明)。

 

如ugoni没有传送data参数,urllib2使用GET方式的请求。GET和POST请求的不同之处是POST请求通常有”副作用”,它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。

尽管HTTP标准说的很清楚POSTs通常会产生副作用,GET请求不会产生副作用,但没有什么可以阻止GET请求产生副作用,同样POST请求也可能不产生副作用。Data同样可以通过在Get请求

的URL本身上面编码来传送。

 

可看如下例子

[python:nogutter]
>>> import urllib2 
 
>>> import urllib 
 
>>> data = {} 
 
>>> data['name'] = ‘Somebody Here’ 
 
>>> data['location'] = ‘Northampton’ 
 
>>> data['language'] = ‘Python’ 
 
>>> url_values = urllib.urlencode(data) 
 
>>> print url_values 
 
name=Somebody+Here&language=Python&location=Northampton 
 
>>> url = ‘http://www.example.com/example.cgi’ 
 
>>> full_url = url + ‘?’ + url_values 
 
>>> data = urllib2.open(full_url) 
 

 

Headers

我们将在这里讨论特定的HTTP头,来说明怎样添加headers到你的HTTP请求。

 

有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.5),

这个身份可能会让站点迷惑,或者干脆不工作。浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。下面的例子发送跟上面一样的内容,但把自身

模拟成Internet Explorer。

 

[python:nogutter] 
import urllib 
 
import urllib2 
 
  
 
url = ‘http://www.someserver.com/cgi-bin/register.cgi’ 
 
user_agent = ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)’ 
 
values = {‘name’ : ‘Michael Foord’, 
 
          ‘location’ : ‘Northampton’, 
 
          ‘language’ : ‘Python’ } 
 
headers = { ‘User-Agent’ : user_agent } 
 
  
 
data = urllib.urlencode(values) 
 
req = urllib2.Request(url, data, headers) 
 
response = urllib2.urlopen(req) 
 
the_page = response.read() 
 

 

response应答对象同样有两个很有用的方法。看下面的节info and geturl,我们将看到当发生错误时会发生什么。

 

 

Handle Exceptions处理异常

当urlopen不能够处理一个response时,产生urlError(不过通常的Python APIs异常如ValueError,TypeError等也会同时产生)。

 

HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

 

URLError

通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有”reason”属性,它是一个tuple,包含了一个错误号和一个错误信息。

 

例如

 

[python:nogutter] 
>>> req = urllib2.Request(‘http://www.pretend_server.org’) 
 
>>> try: urllib2.urlopen(req) 
 
>>> except URLError, e: 
 
>>>    print e.reason 
 
>>> 
 
(4, ‘getaddrinfo failed’) 
 

 

HTTPError

服务器上每一个HTTP 应答对象response包含一个数字”状态码”。有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答(例如:假如response是一个”重定向”,需要客户端从别的地址获取文档

,urllib2将为你处理)。其他不能处理的,urlopen会产生一个HTTPError。典型的错误包含”404″(页面无法找到),”403″(请求禁止),和”401″(带验证请求)。

 

请看RFC 2616 第十节有所有的HTTP错误码

 

HTTPError实例产生后会有一个整型’code’属性,是服务器发送的相关错误号。

 

Error Codes错误码

因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

 

BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了RFC 2616使用的所有的应答号。这里为了方便重新展示该字典。(译者略)

 

 

当一个错误号产生后,服务器返回一个HTTP错误号,和一个错误页面。你可以使用HTTPError实例作为页面返回的应答对象response。这表示和错误属性一样,它同样包含了read,geturl,和info方法。

 

[python:nogutter] 
>>> req = urllib2.Request(‘http://www.python.org/fish.html’) 
 
>>> try: 
 
>>>     urllib2.urlopen(req) 
 
>>> except URLError, e: 
 
>>>     print e.code 
 
>>>     print e.read() 
 
>>> 
 
404 
 
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” 
 
    “http://www.w3.org/TR/html4/loose.dtd”> 
 
<?xml-stylesheet href=”./css/ht2html.css” 
 
    type=”text/css”?> 
 
<html><head><title>Error 404: File Not Found</title> 
 
…… etc… 
 

 

Wrapping it Up包装

 

所以如果你想为HTTPError或URLError做准备,将有两个基本的办法。我则比较喜欢第二种。

 

第一个:

[python:nogutter] 
from urllib2 import Request, urlopen, URLError, HTTPError 
 
req = Request(someurl) 
 
try: 
 
    response = urlopen(req) 
 
except HTTPError, e: 
 
    print ‘The server couldn/’t fulfill the request.’ 
 
    print ‘Error code: ‘, e.code 
 
except URLError, e: 
 
    print ‘We failed to reach a server.’ 
 
    print ‘Reason: ‘, e.reason 
 
else: 
 
    # everything is fine 
 

注意:except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError。

 

 

第二个:

[python:nogutter] 
from urllib2 import Request, urlopen, URLError 
 
req = Request(someurl) 
 
try: 
 
    response = urlopen(req) 
 
except URLError, e: 
 
    if hasattr(e, ‘reason’): 
 
        print ‘We failed to reach a server.’ 
 
        print ‘Reason: ‘, e.reason 
 
    elif hasattr(e, ‘code’): 
 
        print ‘The server couldn/’t fulfill the request.’ 
 
        print ‘Error code: ‘, e.code 
 
else: 
 
    # everything is fine 
 

 

info and geturl

urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

 

geturl — 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许

会有重定向。获取的URL或许跟请求URL不同。

 

info — 这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。

 

经典的headers包含”Content-length”,”Content-type”,和其他。查看Quick Reference to HTTP Headers(http://www.cs.tut.fi/~jkorpela/http.html)

获取有用的HTTP头列表,以及它们的解释意义。

 

Openers和Handlers

 

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例,urllib2.OpenerDirector可能名字可能有点让人混淆。)正常情况下,我们

使用默认opener — 通过urlopen,但你能够创建个性的openers,Openers使用处理器handlers,所有的“繁重”工作由handlers处理。每个handlers知道

如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面,例如HTTP重定向或者HTTP cookies。

 

如果你希望用特定处理器获取URLs你会想创建一个openers,例如获取一个能处理cookie的opener,或者获取一个不重定向的opener。

要创建一个 opener,实例化一个OpenerDirector,然后调用不断调用.add_handler(some_handler_instance).

 

同样,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。

 

build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。

 

其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。

 

install_opener 用来创建(全局)默认opener。这个表示调用urlopen将使用你安装的opener。

 

Opener对象有一个open方法,该方法可以像urlopen函数那样直接用来获取urls:通常不必调用install_opener,除了为了方便。

 

 

 

Basic Authentication 基本验证

为了展示创建和安装一个handler,我们将使用HTTPBasicAuthHandler,为了更加细节的描述本主题–包含一个基础验证的工作原理。

请看Basic Authentication Tutorial(http://www.voidspace.org.uk/python/articles/authentication.shtml)

 

 

当需要基础验证时,服务器发送一个header(401错误码) 请求验证。这个指定了scheme 和一个‘realm’,看起来像这样:Www-authenticate: SCHEME realm=”REALM”.

 

 

例如

Www-authenticate: Basic realm=”cPanel Users”

 

客户端必须使用新的请求,并在请求头里包含正确的姓名和密码。这是“基础验证”,为了简化这个过程,我们可以创建一个HTTPBasicAuthHandler的实例,并让opener使用这个

handler。

 

HTTPBasicAuthHandler使用一个密码管理的对象来处理URLs和realms来映射用户名和密码。如果你知道realm(从服务器发送来的头里)是什么,你就能使用HTTPPasswordMgr。

通常人们不关心realm是什么。那样的话,就能用方便的HTTPPasswordMgrWithDefaultRealm。这个将在你为URL指定一个默认的用户名和密码。这将在你为特定realm提供一个其他组合时

得到提供。我们通过给realm参数指定None提供给add_password来指示这种情况。

 

最高层次的URL是第一个要求验证的URL。你传给.add_password()更深层次的URLs将同样合适。

 

[python:nogutter] 
# 创建一个密码管理者 
 
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
 
  
 
# 添加用户名和密码 
 
# 如果知道 realm, 我们可以使用他代替 “None“. 
 
top_level_url = “http://example.com/foo/” 
 
password_mgr.add_password(None, top_level_url, username, password) 
 
  
 
handler = urllib2.HTTPBasicAuthHandler(password_mgr) 
 
  
 
# 创建 “opener” (OpenerDirector 实例) 
 
opener = urllib2.build_opener(handler) 
 
  
 
# 使用 opener 获取一个URL 
 
opener.open(a_url) 
 
  
 
# 安装 opener. 
 
# 现在所有调用 urllib2.urlopen 将用我们的 opener. 
 
urllib2.install_opener(opener) 
 
  
 

注意:以上的例子我们仅仅提供我们的HHTPBasicAuthHandler给build_opener。默认的openers有正常状况的handlers–ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor。

 
top_level_url 实际上可以是完整URL(包含”http:”,以及主机名及可选的端口号)例如:http://example.com/,也可以是一个“authority”(即主机名和可选的

包含端口号)例如:“example.com” or “example.com:8080”(后者包含了端口号)。权限验证,如果递交的话不能包含”用户信息”部分,例如:

“joe@password:example.com”是错误的。
Proxies代理urllib 将自动监测你的代理设置并使用他们。这个通过ProxyHandler这个在正常处理器链中的对象来处理。通常,那工作的很好。但有时不起作用

。其中一个方法便是安装我们自己的代理处理器ProxyHandler,并不定义代理。这个跟使用Basic Authentication 处理器很相似。

 

[python:nogutter] 
>>> proxy_support = urllib.request.ProxyHandler({}) 
>>> opener = urllib.request.build_opener(proxy_support) 
>>> urllib.request.install_opener(opener) 
 

注意:
此时urllib.request不支持通过代理获取https地址。但,这个可以通过扩展urllib.request达到目的。
Sockets and Layers
Python支持获取网络资源是分层结构。urllib 使用http.client库,再调用socket库实现。

在Python2.3你可以指定socket的等待回应超时时间。这个在需要获取网页的应用程序里很有用。默认的socket模型没有超时和挂起。现在,socket超时没有暴露  www.2cto.com

给http.client或者urllib.request层。但你可以给所有的sockets设置全局的超时。

 

作者:lmh12506

python模块:win32com用法详解

1)安装

(2)处理word

使用技巧

import win32com
from win32com.client import Dispatch, constants

w = win32com.client.Dispatch(‘Word.Application’)
# 或者使用下面的方法,使用启动独立的进程:
# w = win32com.client.DispatchEx(‘Word.Application’)

# 后台运行,不显示,不警告
w.Visible = 0
w.DisplayAlerts = 0

# 打开新的文件
doc = w.Documents.Open( FileName = filenamein )
# worddoc = w.Documents.Add() # 创建新的文档

# 插入文字
myRange = doc.Range(0,0)
myRange.InsertBefore(‘Hello from Python!’)

# 使用样式
wordSel = myRange.Select()
wordSel.Style = constants.wdStyleHeading1

# 正文文字替换
w.Selection.Find.ClearFormatting()
w.Selection.Find.Replacement.ClearFormatting()
w.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2)

# 页眉文字替换
w.ActiveDocument.Sections[0].Headers[0].Range.Find.ClearFormatting()
w.ActiveDocument.Sections[0].Headers[0].Range.Find.Replacement.ClearFormatting()
w.ActiveDocument.Sections[0].Headers[0].Range.Find.Execute(OldStr, False, False, False, False, False, True, 1, False, NewStr, 2)

# 表格操作
doc.Tables[0].Rows[0].Cells[0].Range.Text =’123123′
worddoc.Tables[0].Rows.Add() # 增加一行

# 转换为html
wc = win32com.client.constants
w.ActiveDocument.WebOptions.RelyOnCSS = 1
w.ActiveDocument.WebOptions.OptimizeForBrowser = 1
w.ActiveDocument.WebOptions.BrowserLevel = 0 # constants.wdBrowserLevelV4
w.ActiveDocument.WebOptions.OrganizeInFolder = 0
w.ActiveDocument.WebOptions.UseLongFileNames = 1
w.ActiveDocument.WebOptions.RelyOnVML = 0
w.ActiveDocument.WebOptions.AllowPNG = 1
w.ActiveDocument.SaveAs( FileName = filenameout, FileFormat = wc.wdFormatHTML )

# 打印
doc.PrintOut()

# 关闭
# doc.Close()
w.Documents.Close(wc.wdDoNotSaveChanges)
w.Quit()

(3)处理excel

[1]使用PyExcelerator读写EXCEL文件(Platform: Win,Unix-like)
优点:简单易用      缺点:不可改变已存在的EXCEL文件。
PyExcelerator是一个开源的MS Excel文件处理python包。它主要是用来写 Excel 文件.URL: http://sourceforge.net/projects/pyexcelerator/
我没有找到关于PyExcelerator的文档。只是看到了limodou的一篇介绍:http://www.2cto.com/kf/201206/137853.html

这个包使用起来还是比较简单的:)。带了很多小例子,可以参照。
例mini.py.
=================================
#!/usr/bin/env python
# -*- coding: windows-1251 -*-
# Copyright (C) 2005 Kiseliov Roman
__rev_id__ = “”"$Id: mini.py,v 1.3 2005/03/27 12:47:06 rvk Exp $”"”
“导入模块
from pyExcelerator import *
“生成一个工作薄
w = Workbook()
“加入一个Sheet
ws = w.add_sheet(‘Hey, Dude’)
“保存
w.save(‘mini.xls’)
=================================
[2]使用COM接口,直接操作EXCEL(只能在Win上)
优点:可以满足绝大数要求。缺点:有些麻烦。:-)
这方面的例子很多,GOOGLE 看吧:-). 文档也可以参看OFFICE自带的VBA EXCEL 帮助文件(VBAXL.CHM)。这里面讲述了EXCEL VBA的编程概念,
不错的教程!另外,《Python Programming on Win32》书中也有很详细的介绍。这本书中给出了一个类来操作EXCEL 文件,可以很容易的加以扩展。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from win32com.client import Dispatch
import win32com.client
class easyExcel:
    “”"A utility to make it easier to get at Excel.  Remembering
    to save the data is your problem, as is  error handling.
    Operates on one workbook at a time.”"”
    def __init__(self, filename=None):
        self.xlApp = win32com.client.Dispatch(‘Excel.Application’)
        if filename:
            self.filename = filename
            self.xlBook = self.xlApp.Workbooks.Open(filename)
        else:
            self.xlBook = self.xlApp.Workbooks.Add()
            self.filename = ” 
    def save(self, newfilename=None):
        if newfilename:
            self.filename = newfilename
            self.xlBook.SaveAs(newfilename)
        else:
            self.xlBook.Save()   
    def close(self):
        self.xlBook.Close(SaveChanges=0)
        del self.xlApp
    def getCell(self, sheet, row, col):
        “Get value of one cell”
        sht = self.xlBook.Worksheets(sheet)
        return sht.Cells(row, col).Value
    def setCell(self, sheet, row, col, value):
        “set value of one cell”
        sht = self.xlBook.Worksheets(sheet)
        sht.Cells(row, col).Value = value
    def getRange(self, sheet, row1, col1, row2, col2):
        “return a 2d array (i.e. tuple of tuples)”
        sht = self.xlBook.Worksheets(sheet)
        return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Value
    def addPicture(self, sheet, pictureName, Left, Top, Width, Height):
        “Insert a picture in sheet”
        sht = self.xlBook.Worksheets(sheet)
        sht.Shapes.AddPicture(pictureName, 1, 1, Left, Top, Width, Height)
    def cpSheet(self, before):
        “copy sheet”
        shts = self.xlBook.Worksheets
        shts(1).Copy(None,shts(1))
“下面是一些测试代码。
if __name__ == “__main__”:
    PNFILE = r’c:\screenshot.bmp’
    xls = easyExcel(r’D:\test.xls’)
    xls.addPicture(‘Sheet1′, PNFILE, 20,20,1000,1000)
    xls.cpSheet(‘Sheet1′)
    xls.save()
    xls.close()

(4)python调用短信猫控件,发短信

#! /usr/bin/env python

#coding=gbk
import sys
import win32com.client
ocxname=’ShouYan_SmsGate61.Smsgate’
axocx=win32com.client.Dispatch(ocxname)
axocx.CommPort=8#设置COM端口号
axocx.SmsService=’+8613800100500′#设置短信服务号码
axocx.Settings=’9600,n,8,1′#设置com端口速度
axocx.sn=’loyin’
c=axocx.Connect(1)#连接短信猫或手机
 
print ‘连接情况’,axocx.Link()
 
axocx.SendSms(‘python确实是很好的’,’15101021000′,0)#发送短信

 作者:木雨山

Python去除String中的空格/换行/回车等

join:在序列中添加元素
split: 将字符串分解成序列
两者为互逆方法

Python代码 
     
    s = “as, asdas \r\nasda” 
    print s.split(); 
#   result: ['as,', 'asdas', 'asda'] 
 
    print “”.join(s.split()); 
#    result: as,asdasasda 
 
    l = “”.join(s.split()).split(‘,’); 
    print l; 
#   result: ['as', 'asdasasda'] 

免费学习编程的10个好工具

这个连小孩子都知道开发App的时代,编程是一项必学功能,没必要拿着枯燥的书本在那里死啃,而是即刻动手才能学得快。所以我们要来看看这些免费编程资源。
1. Code/Racer
Code/Racer 是一个在线编程游戏,会强迫你快速编程,在编程游戏中,Code/Racer所属Treehouse团队拥有超过650个教学视屏,当你完成某个课程的话,就会获得相应的徽章。

2. MIT OpenCourseWare
因为它开放了课程内容,所以每个人都可以从这个机构学到东西。这对于背负着沉重贷款的学生来说是非常美好的一件事。

3. Udacity
Udacity相信当今的高端教育系统被破坏了,教育不再是某个时间段的事情,而是终生的事情,所以它的教学内容里面包括了大量的计算机科学,数学和物理在线课程。

4. Mozilla Developer Network
这是一个搜集Web开发的公资料网站,里面有专家、学生。MDN是一个Wiki式网站,所以任何人都可以编辑和修改它的页面。

5. The CodePlayer
这里有互动演示文稿告诉你人们是如何从头构建事情的,在你变成一个编程员后,你也可以把自己一步一步的学习的演示文稿传上去,告诉别人你是怎么学习编程的。

6. Coursera
这个顶级在线教育平台有各个大学的在线资源,来自62个大学的教授老师等。而且支持英语、西班牙语、法语、意大利语和中文。

7. Codeacademy
Codeacadem只专注编程教学,包括APIs, Ruby, Python, JavaScript, jQuery, PHP,Web基础语言等。

8. Khan Academy
从编程到微积分,计算机科学理论,在这里你可以同时成为专业编码师和专业数学家。

9. Learn Python the Hard Way
该网站提供免费的PDF,如果需要视频课程的话,你需要支付29美元。在这里学习的时候, 你不能复制粘贴,只能一个一个字符输入。

10. HTML5 Rocks
这里是学习HTML 5的一站式教学,都是在Google、Adobe等工作的人写的,然后学生们通过幻灯片、演示文稿和视频来学习。

Via mashable