Python的兩種引入機(jī)制
Python 提供了二種引入機(jī)制:
1.relative import
2.absolute impor
relative import
relative import 也叫作相對(duì)引入拍棕,在Python2.5及之前是默認(rèn)的引入方法。它的使用方法如下:
from .string import a
from ..string import a
from ...string import a
這種引入方式使用一個(gè)點(diǎn)號(hào)來標(biāo)識(shí)引入類庫的精確位置扮惦。與linux的相對(duì)路徑表示相似,一個(gè)點(diǎn)表示當(dāng)前目錄荸频,每多一個(gè)點(diǎn)號(hào)則代表向上一層目錄瓤鼻。
absolute import
absolute import 也叫作完全引入,非常類似于Java的引入進(jìn)制,在Python2.5被完全實(shí)現(xiàn)础废,但是是需要通過from future import absolute_import來打開該引入進(jìn)制。在Python2.6之后以及Python3罕模,完全引用成為Python的默認(rèn)的引入機(jī)制色迂。它的使用方法如下:
from pkg import foo
from pkg.moduleA import foo
要注意的是,需要從包目錄最頂層目錄依次寫下手销,而不能從中間開始歇僧。
Python中的import語句既可以引入模塊中的類, 也可以引入模塊中的變量, 還可以引入模塊中的函數(shù).
一般來說,要使用某個(gè)類的方法锋拖,需要先實(shí)例化一個(gè)對(duì)象再調(diào)用方法诈悍。
而使用@staticmethod或@classmethod,就可以不需要實(shí)例化兽埃,直接類名.方法名()來調(diào)用侥钳。
這有利于組織代碼,把某些應(yīng)該屬于某個(gè)類的函數(shù)給放到那個(gè)類里去柄错,同時(shí)有利于命名空間的整潔舷夺。
既然@staticmethod和@classmethod都可以直接類名.方法名()來調(diào)用,那他們有什么區(qū)別呢
從它們的使用上來看,
@staticmethod不需要表示自身對(duì)象的self和自身類的cls參數(shù)售貌,就跟使用函數(shù)一樣给猾。
@classmethod也不需要self參數(shù),但第一個(gè)參數(shù)需要是表示自身類的cls參數(shù)颂跨。
如果在@staticmethod中要調(diào)用到這個(gè)類的一些屬性方法敢伸,只能直接類名.屬性名或類名.方法名。
而@classmethod因?yàn)槌钟衏ls參數(shù)恒削,可以來調(diào)用類的屬性池颈,類的方法尾序,實(shí)例化對(duì)象等,避免硬編碼躯砰。
下面上代碼每币。
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
創(chuàng)建兩個(gè).py文件一個(gè)用來配置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()
然后在終端中(要在虛擬環(huán)境下)運(yùn)行
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
就可以初始化數(shù)據(jù)庫
在建一個(gè)run.py
#!/usr/bin/env python
from app import create_app
app = create_app('config')
if __name__ == '__main__':
app.run()
就可以運(yùn)行APP
獲取工程目錄
projectDir = os.getcwd()
讀文件
filePath = projectDir + "/resource/Insure_getAllCity.json"
jsonStr = open(filePath)
jsonStr.read()
創(chuàng)建request請(qǐng)求
對(duì)html解析讀取編碼格式,統(tǒng)一轉(zhuǎn)碼為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’]探知是何種類型的編碼兰怠,對(duì)其進(jìn)行譯碼,再編碼矿微。
解決python UnicodeDecodeError: 'gb2312' codec can't decode問題
問題:UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence
原因:Python在做將普通字符串轉(zhuǎn)換為unicode對(duì)象時(shí)痕慢,
例如: u_string = unicode(string , "gb2312")尚揣,如果你的字符串string中有諸如某些繁體字涌矢,例如"河滘小學(xué)"
中的滘,那么gb2312作為簡(jiǎn)體中文編碼是不能進(jìn)行解析的快骗,必須使用國標(biāo)擴(kuò)展碼gbk娜庇,gbk支持繁體中文和日文假文
解決方法:使用gbk,代替gb2312方篮,例如:u_string = unicode(string , "gbk")
python下載文件的三種方法
Python開發(fā)中時(shí)長(zhǎng)遇到要下載文件的情況名秀,最常用的方法就是通過Http利用urllib或者urllib2模塊。
當(dāng)然你也可以利用ftplib從ftp站點(diǎn)下載文件藕溅。此外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最為簡(jiǎn)單,一句語句即可巾表。當(dāng)然你可以把urllib2縮寫成:
f = urllib2.urlopen(url)
with open("demo2.zip", "wb") as code:
code.write(f.read())