python学习笔记十 类文件对象 分类: python基础学习 python 2013-06-18 12:03 254人阅读 评论(0) 收藏

详见 163博客收藏夹

1,

类文件对象是任意一个带有read方法的对象,read方法有一个可选的size参数。
如果没有指定size,就会从输入源读入所有的数据作为单个字符串返回,否则,只读入size个数据返回。再次调用会从size处接着读。

2,
解析来自url的xml文件:
>>> importurllib
>>> usock =urllib.urlopen('http://slashdot.org/slashdot.rdf') (1)
>>> xmldoc =minidom.parse(usock) (2)
>>> usock.close()(3)
>>> printxmldoc.toxml() (4)
将打印出xml文件

urlopen接受url作为参数,返回一个类文件对象。

3,
解析字符串xml:
>>> contents ="<grammar><refid='bit'><p>0</p><p>1</p></ref></grammar>"
>>> xmldoc =minidom.parseString(contents) (1)
>>> printxmldoc.toxml()
<?xml version="1.0" ?>
<grammar><refid="bit"><p>0</p><p>1</p></ref></grammar>

使用minidom的parseString函数,接受用string表示的xml

这样不方便,需要用parse之外的函数,可以将string包装成类文件对象。

使用StringIO:
>>> contents ="<grammar><refid='bit'><p>0</p><p>1</p></ref></grammar>"
>>> importStringIO
>>> ssock =StringIO.StringIO(contents) (1)
>>> ssock.read()(2)
"<grammar><refid='bit'><p>0</p><p>1</p></ref></grammar>"
>>> ssock.read()(3)
''
>>> ssock.seek(0)(4)
>>> ssock.read(15)(5)
'<grammar><refi'
>>>ssock.read(15)
"d='bit'><p>0</p"
>>> ssock.read()
'><p>1</p></ref></grammar>'
>>> ssock.close()(6)

StringIO包中的StringIO类可以将字符串转换成类文件对象。
上例还体现了使用size参数的效果:下一次从size的地方接着读。

用类文件方式解析字符串的代码:
>>> contents ="<grammar><refid='bit'><p>0</p><p>1</p></ref></grammar>"
>>> ssock =StringIO.StringIO(contents)
>>> xmldoc =minidom.parse(ssock) (1)
>>>ssock.close()
>>> printxmldoc.toxml()
<?xml version="1.0" ?>
<grammar><refid="bit"><p>0</p><p>1</p></ref></grammar>

4,
类文件对象stdout,stderr。这两个对象是只写的,没有read方法,但是可以通过将它们绑定到其他的类文件对象来得到不同的输出的位置,默认是打印到屏幕。

例如:
#stdout.py
import sys
print 'Dive in' (1)
saveout = sys.stdout (2)
fsock = open('out.log', 'w') (3)
sys.stdout = fsock (4)
print 'This message will be logged instead of displayed' (5)
sys.stdout = saveout (6)
fsock.close() (7)

(2)始终在重定向前保存stdout,这样之后还可以设置回来。
(5)这句话将打印到文件out.log中

重定向stderr完全一样。

5,
链接命令
[you@localhost kgp]$ python kgp.py -g binary.xml (1)
01100111
[you@localhost kgp]$ cat binary.xml (2)
<?xml version="1.0"?>
<!DOCTYPE grammar PUBLIC "-//diveintopython.org//DTDKant Generator Pro v1.0//EN" "kgp.dtd">
<grammar>
<ref id="bit"><p>0</p><p>1</p>
</ref>
<ref id="byte"><p><xrefid="bit"/><xrefid="bit"/><xrefid="bit"/><xrefid="bit"/>\
<xref id="bit"/><xrefid="bit"/><xrefid="bit"/><xrefid="bit"/></p>
</ref>
</grammar>
[you@localhost kgp]$ cat binary.xml | python kgp.py -g - (3)(4)
10110001
(2)window用type代替cat
(3)|表示管道,就是不输出到屏幕,而作为下一个命令的标准输入
(4)-表示脚本从标准输入载入脚本,而不是磁盘上的特定文件

6,
命令行参数

如下文件:
#argecho.py
import sys
for arg in sys.argv: (1)
   print arg
将输出自己的所有参数,例如:

[you@localhost py]$ python argecho.py (1)
argecho.py
[you@localhost py]$ python argecho.py abc def (2)
argecho.py
abc
def
[you@localhost py]$ python argecho.py --help (3)
argecho.py
--help
[you@localhost py]$ python argecho.py -m kant.xml (4)
argecho.py
-m
kant.xml

在sys.argv中包含了命令行参数的信息。

7,
对与复杂的参数,要使用getopt模块。
getopt模块的getopt函数有三个参数:参数列表、一个包含所有程序可能接收到的单字符命令行标志、和一个等价于单字符命令行标志的长命令行标志的列表。
getopt会抛出异常。
例如:
def main(argv):
  grammar = "kant.xml" (1)
  try:
    opts, args =getopt.getopt(argv, "hg:d", ["help", "grammar="]) (2)
    exceptgetopt.GetoptError: (3)
  usage() (4)
  sys.exit(2)
...

if __name__ == "__main__":
  main(sys.argv[1:])
长命令行标志对应短命令行标志,比如-help和-h的效果是一样的,这就是第三个参数指定的作用。
-g后面会需要一个参数(比如例子中需要一个语法参数的名称),但是目前不知道,所以用:代替。
在上面的例子中,-d没有对应的长参数。
posted @ 2013-06-18 12:03  前行者2011  阅读(107)  评论(0编辑  收藏  举报