python 代碼本

當前執行文件

  • _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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章