Python小知識點

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()) 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容