当前执行文件
- _file_
- sys.argv[0]
__file__和sys.argv[0]都可以获得当前执行文件的文件名。在当前执行文件中,获得的值是相同的。在外部文件调用的情况下__file__获取当前文件,而sys.argv[0] 则是py调用文件。
路径
_file_:可能是相对路径。取决于外部执行python的时候的路径
sys.argv[0]:可能是相对路径
import os,sys
dir, file = os.path.split(os.path.abspath(sys.argv[0]))
---------------------------------------------------
import os,sys
dir = os.path.realpath(__file__)
io读取文件
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
with open('/path/to/file', 'r') as f:
print(f.read())
字符串匹配
line.index("12312") > 0
line.find("12312") > 0
"12312" in line
使用in的方法是最短的
基本数据结构(列表, 元组,字典)
list = [1,2,3,4]
tup = (1,2,3)
dict = {"1":1,"2":2}
列表字典不用多解释,元组跟列表类似,不过无法修改。
match findall
import re
march匹配成功后,返回Match对象
返回string中所有与pattern相匹配的全部字串,返回形式为数组。
_name_ and main()
if __name__ == "__main__":
我们用python写的各个module都可以包含一个类似main函数,只不过python中的这种__main__与c中有一些区别,主要体现在:
- 当单独执行该module时,if为true
- 当被其他python引用是,if为false
global 全局变量
strTest='**123**'
def test():
global strTest
print strTest
定义全局变量,在function内使用global声明
GlobalVar.py
VarA = "hello"
VarB = "world"
Test.py
import GlobalVar
print GlobalVar.VarA + " " + GlobalVar.VarB
在文件中定义全局变量,通过文件.方式访问变量
xml解析
常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。
python有三种方法解析XML,SAX,DOM,以及ElementTree。
SAX是一种基于事件驱动的API。
利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;
而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。
1、对大型文件进行处理;
2、只需要文件的部分内容,或者只需从文件中得到特定信息。
3、想建立自己的对象模型的时候。
在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。
import xml.sax
class xmlHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentTag = ""
self.CostomData ={}
def startElement(self,tag, attributes):
self.CurrentTag = tag
if tag == "head" :
if attributes.has_key("size"):
print("deal start element" + attributes["size"])
elif tag == "body" :
print "deal body"
def endElement(self,tag):
if self.CurrentTag == "head":
print "deal hand end"
elif self.CurrentTag == "body":
print "deal body end"
self.CurrentTag = ""
def characters(self, content):
print "deal content"
if __name__ == "__main__":
file_name = "xxx.xml"
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces,0)
handler = xmlHandler()
parser.setContentHandler(handler)
parser.parse(file_name)
类型转换 int str
int("60")
str(60)
类
class A():
def __init__(self):
self.attr = []
def __str__(self):
print 'A:%s' % (self.attr)
def setAttr(value):
self.attr = value
继承
class A(object):
def __init__(self):
self.attr = []
class B(A):
def __init__(self):
super(B,self).__init__()
定义class的时候参数就是继承的父类。
class A():
def __init__(self):
self.attr = []
class B(A):
def __init__(self):
super(B,self).__init__()
TypeError: must be type, not classobj
父类未继承object,在初始化b时就会报错。需要显示调用父类_init_()执行时,
class B(A):
def __init__(self):
A.__init__()
super(childB, self).init()
_init_() _str_()
_init_() 是类构造方法,继承关系中子类需要手动调用父类构造方法。
_str_() 如果要把一个类的实例变成 str
单下划线、双下划线、头尾双下划线说明:
- _foo_: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。
- _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
- __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
python syntaxerror non-ascii character
原因: 文件中存在汉子或其他字符
解决方法: 文件头添加
#coding:utf-8
外部参数args
import sys
f1 = int(sys.argv[1])
f2 = int(sys.argv[2])
f3 = int(sys.argv[3])
f4 = int(sys.argv[4])
print(f1, f2, f3, f4)
相对路径
os.path.abspath("..\..\")
编译pyc
pyc文件是py文件编译后生成的字节码文件(byte code)。pyc文件经过python解释器最终会生成机器码运行。所以pyc文件是可以跨平台部署的,类似Java的.class文件。一般py文件改变后,都会重新生成pyc文件。
为什么要手动提前生成pyc文件呢,主要是不想把源代码暴露出来。
python -m py_compile test.py
字符串替换
a = 'hello word'
b = a.replace('word','python')
print b
绝对路径转相对路径
print os.path.relpath("d:/test/test.py")
是根据当前路径的相对路径
相对路径转绝对路径
path = "..\test.py"
print os.path.abspath(path)
递归遍历文件,文件夹
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))
执行cmd命令
import os
cmd = 'mkidr a'
os.system(cmd)
执行cmd多多条命令
import os
cmd = 'cd ../../res & dir'
os.system(cmd)