當前執行文件
- _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)