Python的兩種引入機制
Python 提供了二種引入機制:
1.relative import
2.absolute impor
relative import
relative import 也叫作相對引入,在Python2.5及之前是默認的引入方法。它的使用方法如下:
from .string import a
from ..string import a
from ...string import a
這種引入方式使用一個點號來標識引入類庫的精確位置。與linux的相對路徑表示相似,一個點表示當前目錄,每多一個點號則代表向上一層目錄。
absolute import
absolute import 也叫作完全引入,非常類似于Java的引入進制,在Python2.5被完全實現,但是是需要通過from future import absolute_import來打開該引入進制。在Python2.6之后以及Python3,完全引用成為Python的默認的引入機制。它的使用方法如下:
from pkg import foo
from pkg.moduleA import foo
要注意的是,需要從包目錄最頂層目錄依次寫下,而不能從中間開始。
Python中的import語句既可以引入模塊中的類, 也可以引入模塊中的變量, 還可以引入模塊中的函數.
一般來說,要使用某個類的方法,需要先實例化一個對象再調用方法。
而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。
這有利于組織代碼,把某些應該屬于某個類的函數給放到那個類里去,同時有利于命名空間的整潔。
既然@staticmethod和@classmethod都可以直接類名.方法名()來調用,那他們有什么區別呢
從它們的使用上來看,
@staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
@classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。
如果在@staticmethod中要調用到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
而@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
下面上代碼。
class A(object):
bar = 1
def foo(self):
print 'foo'
@staticmethod
def static_foo():
print 'static_foo'
print A.bar
@classmethod
def class_foo(cls):
print 'class_foo'
print cls.bar
cls().foo()
A.static_foo()
A.class_foo()
輸出
static_foo
1
class_foo
1
foo
創建兩個.py文件一個用來配置manage.py
from app import create_app, db
from app.models import User
from flask_migrate import Migrate, MigrateCommand, upgrade
from flask_script import Manager, Shell
app = create_app('default')
manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
然后在終端中(要在虛擬環境下)運行
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
就可以初始化數據庫
在建一個run.py
#!/usr/bin/env python
from app import create_app
app = create_app('config')
if __name__ == '__main__':
app.run()
就可以運行APP
獲取工程目錄
projectDir = os.getcwd()
讀文件
filePath = projectDir + "/resource/Insure_getAllCity.json"
jsonStr = open(filePath)
jsonStr.read()
創建request請求
對html解析讀取編碼格式,統一轉碼為utf-8
from urllib.request import urlopen
import chardet
response=urlopen(url,timeout=3)
html_byte=response.read()
chardit1 = chardet.detect(html_byte)
file = open(PROJECT_NAME + '/' + str(ALLNUM) + '.html', 'wb') html_string=html_byte.decode(chardit1['encoding']).encode('utf-8')
file.write(html_string)
file.close()
利用到了chardet中的detect方法,獲取chardit1[‘encoding’]探知是何種類型的編碼,對其進行譯碼,再編碼。
解決python UnicodeDecodeError: 'gb2312' codec can't decode問題
問題:UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence
原因:Python在做將普通字符串轉換為unicode對象時,
例如: u_string = unicode(string , "gb2312"),如果你的字符串string中有諸如某些繁體字,例如"河滘小學"
中的滘,那么gb2312作為簡體中文編碼是不能進行解析的,必須使用國標擴展碼gbk,gbk支持繁體中文和日文假文
解決方法:使用gbk,代替gb2312,例如:u_string = unicode(string , "gbk")
python下載文件的三種方法
Python開發中時長遇到要下載文件的情況,最常用的方法就是通過Http利用urllib或者urllib2模塊。
當然你也可以利用ftplib從ftp站點下載文件。此外Python還提供了另外一種方法requests。
下面來看看三種方法是如何來下載zip文件的:
方法一:
import urllib
import urllib2
import requests
print "downloading with urllib"
url = 'http://www.pythontab.com/test/demo.zip'
print "downloading with urllib"
urllib.urlretrieve(url, "demo.zip")
方法二:
import urllib2
print "downloading with urllib2"
url = 'http://www.pythontab.com/test/demo.zip'
f = urllib2.urlopen(url)
data = f.read()
with open("demo2.zip", "wb") as code:
code.write(data)
方法三:
import requests
print "downloading with requests"
url = 'http://www.pythontab.com/test/demo.zip'
r = requests.get(url)
with open("demo3.zip", "wb") as code:
code.write(r.content)
看起來使用urllib最為簡單,一句語句即可。當然你可以把urllib2縮寫成:
f = urllib2.urlopen(url)
with open("demo2.zip", "wb") as code:
code.write(f.read())