python筆記七之操做MySQL、excel、Redis&開發接口

1、MySQL操做補充html

cur = coon.cursor(cursor=pymysql.cursors.DictCursor)
創建遊標的時候指定了遊標類型,返回的就是一個字典了。
fetchall() #獲取到這個sql執行的所有結果,它把數據庫表裏面的每一行數據放到一個list裏面
[ ['1','2','3'] ] [{},{},{}]
fetchone() #獲取到這個sql執行的一條結果,它返回就只是一條數據

若是sql語句執行的結果是多條數據的時候,那就用fetchall()
若是你能肯定sql執行的結果就只有一條,那麼就用fetchone()

enumerate([list,list2]) #循環的時候,直接獲取到下標,和值
for index,value in enumerate([list,list2]):#list2裏面是什麼?
print(index,vlaue)
fileds = ['id','name','sex','addr','gold','score']
for index,filed in enumerate(fileds):
    print(index,filed)

運行結果:node

0 id
1 name
2 sex
3 addr
4 gold
5 score

一個返回數據庫表頭字段的函數:python

import pymysql
def my_db(sql,port=3306,charset='utf8'):
    import pymysql
    host, user, passwd, db = '118.24.3.40','jxz','123456','jxz'
    coon = pymysql.connect(user=user,host=host,port=port,passwd=passwd,db=db,charset=charset)
    cur = coon.cursor(cursor=pymysql.cursors.DictCursor) #創建遊標,指定cursor類型返回的是字典
    cur.execute(sql)#執行sql
    if sql.strip()[:6].upper()=='SELECT':
        # res = cur.fetchall()
        fileds = []
        # for filed in cur.description:#cur.description可直接獲取到建表時的字段描述信息,如('id', 253, None, 40, 40, 0, True)
            # fileds.append(filed[0])
        fileds = [ filed[0] for filed in cur.description ]  #和上面3行代碼的意思是同樣
        print(fileds)
        # cur.fetchmany()  #能傳入一個數,返回多少條數據
        res= 'xx'
    else:
        coon.commit()
        res = 'ok'
    cur.close()
    coon.close()
    return res
res = my_db('select * from users_info limit 10;')#limit用於指定返回的數據條數
print(res)

運行結果:mysql

['id', 'username', 'passwd']
xx

enumerate函數:同時獲取到list的下表和值linux

fileds = ['id','name','sex','addr','gold','score']
for index,filed in enumerate(fileds):
    print(index,filed)

運行結果:web

0 id
1 name
2 sex
3 addr
4 gold
5 score

練習:通用數據庫導出到EXCEL函數redis

import pymysql,xlwt
def export_excel(table_name):
    host, user, passwd, db = '118.24.3.40', 'jxz', '123456', 'jxz'
    coon = pymysql.connect(user=user, host=host, port=3306, passwd=passwd, db=db, charset='utf8')
    cur = coon.cursor()  # 創建遊標,指定cursor類型返回的是字典
    sql = 'select * from %s ;'%table_name
    cur.execute(sql)  # 執行sql
    fileds = [filed[0] for filed in cur.description]  #全部的字段
    all_data = cur.fetchall()#全部的數據
    book = xlwt.Workbook()
    sheet= book.add_sheet('sheet1')
    for col,filed in enumerate(fileds):   #寫表頭的
        sheet.write(0,col,filed)
    row = 1  #行數
    for data in all_data:  #data爲每一行數據
        for col, filed in enumerate(data):  # 控制列寫入
            sheet.write(row, col, filed)
        row+=1#每次寫完一行,行就加1
    book.save('%s.xls'%table_name)
export_excel('app_student')

2、操做Excelsql

   修改Excel:數據庫

import xlrd
from xlutils import copy
book = xlrd.open_workbook('app_student.xls')
#先用xlrd模塊,打開一個excel
new_book = copy.copy(book)
#經過xlutils這個模塊裏面copy方法,複製一份excel
sheet = new_book.get_sheet(0) #獲取sheet頁
lis = ['編號','名字','性別','年齡','地址','班級','手機號','金幣']
for col,filed in enumerate(lis):
    sheet.write(0,col,filed)

new_book.save('app_student.xls')

   讀取Excel:apache

import xlrd
book = xlrd.open_workbook('app_student.xls')
sheet = book.sheet_by_index(0)#根據索引獲取sheet頁
# sheet2 = book.sheet_by_name('sheet1')#根據名稱獲取sheet頁
print(sheet.cell(0,0).value) #指定sheet頁裏面第一行和第一列獲取數據
print(sheet.cell(1,0).value) #指定sheet頁裏面第2行和第1列獲取數據
print(sheet.row_values(0)) #獲取到第1行的內容
print(sheet.row_values(1)) #獲取到第2行的內容
print(sheet.nrows) #獲取到excel裏面總共有多少行
for i in range(sheet.nrows):  #知道行數後,循環獲取到每行數據
    print(sheet.row_values(i))
print(sheet.ncols)  #總共多少列
print(sheet.col_values(0)) #取第幾列的數據

 

3、操做Redis

redis是一個nosql類型的數據庫,數據都存在內存中,有很快的讀寫速度,python操做redis使用redis模塊,pip安裝便可

redis數據所有都是存在內存裏面。
redis自己性能是很是好的,每秒支持30w次的讀寫。

import redis

r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379)#鏈接redis

#增刪改查
r.set('niuhanyang','帥!') #數據庫裏面新增一個值
# hwt = r.get('niuhanyang')#查,根據key獲取對應的值
# print(hwt.decode())
#修改也是set
r.delete('niuhanyang')
r.setex('python_123','哈哈哈',20)  #設置key的失效時間,最後這個參數是秒,時間事後,即刪掉這個KEY
hwt = r.get('mei')#獲取到的是二進制  爲bytes類型
print(hwt.decode())#將bytes類型轉換爲字符串類型,encode將字符串轉換爲bytes
print(hwt)
print(r.keys('*xxx*'))#獲取到全部含xxx的key
print(r.keys())#獲取到全部的KEY
print(r.get('sdfsdf'))
r.set('今天是2018年6月9日:mpp','呵呵呵')#Key中有的冒號的,冒號前面爲文件夾的名稱,同一個文件夾的內容均可以這樣存入
r.set('今天是2018年6月9日:dict','今天是星期六')
for k in r.keys():  #刪除全部的key
    r.delete(k)
# 上面操做都是針對 string類型

# 哈希類型  hash   相似嵌套字典

r.hset('stu_info','劉偉','1m8 100w存款')
r.hset('stu_info','張流量','浪,爲了避免交做業,故意讓狗咬他')
r.hset('stu_info','董春光','爲了避免交做業,找了一條狗咬張流量,而後陪張流量去醫院')
# print(r.type('stu_info'))#查看key的類型
# print(r.hget('stu_info','張流量').decode())  #指定大key和小key獲取對應的數據
# print(r.hgetall('stu_info'))  #獲取裏面全部的k和-v
stu_info  = r.hgetall('stu_info')#獲取到stu_info下的全部k-v
print(stu_info)
stu_dic={}
for k,v in stu_info.items():#stu_info.items()獲取到全部的k-v
    # print(k.decode(),v.decode())
    stu_dic[k.decode()]=v.decode()
print(stu_dic)

r.hdel('stu_info','gyx')  #刪除指定key
r.delete('stu_info')  #刪除整個key
r.expire('aaa',100) #設置失效時間

print(r.type('stu_info'))  #查看key是什麼類型的
print(r.type('zll'))


s='呵呵'
s.encode() #把字符串轉成二進制
hwt = b'sdfsdfsdf'
hwt.decode()  #把bytes類型轉成字符串

#pymysql、json、redis
#一、連數據庫,查到數據庫裏面全部的數據,遊標類型要用pymysql.curosrs.DictCour
#二、查到全部數據   [ {"id":1,"passwd":"49487dd4f94008a6110275e48ad09448","username":"niuhayang","is_admin":1}]
#三、循環這個list,取到usernamer,把username當作key
#四、再把這個小字典轉成json,存進去就ok
import pymysql,json,redis
r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379)
conn = pymysql.connect(host='118.24.3.40',user='jxz',passwd='123456',db='jxz',charset='utf8')
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute('select * from my_user;')
all_data = cur.fetchall()
for data in all_data:
    k = data.get('username')
    r.hset('stu_info_nhy',k,json.dumps(data))
cur.close()
conn.close()

#下面這個是我本身寫的
import pymysql,redis,json
r=redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379)
coon=pymysql.connect(host='118.24.3.40',user='jxz',passwd='123456',db='jxz',charset='utf8')
cur=coon.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute('select * from my_user;')
res=cur.fetchall()
for data in res:
    username=data.get('username')
    data_json=json.dumps(data)#此處代碼可參考上面老師寫的進行精簡
    r.hset('my_user',username,data_json)
cur.close()
coon.close()

4、接口開發

import flask,json  #輕量級的web開發框架
#做爲服務端,來開發接口供別人調用,需先啓動一個服務
server=flask.Flask(__name__)#__name__表明當前這個python文件,
# 這句代碼的意思就是把我們當前的python文件當作一個服務,下面要在這個服務上開發一個接口

#*******get請求能夠在瀏覽器直接訪問,post請求需經過第三方工具調用*****

# ****操做數據庫****
def my_db(sql):
    import pymysql
    coon = pymysql.connect(
        host='118.24.3.40', user='jxz', passwd='123456',
        port=3306, db='jxz', charset='utf8')
    cur = coon.cursor() #創建遊標
    cur.execute(sql)#執行sql
    if sql.strip()[:6].upper()=='SELECT':
        res =  cur.fetchall()
    else:
        coon.commit()
        res = 'ok'
    cur.close()
    coon.close()
    return res
# ****操做數據庫****


# *******第一個接口*******
#ip:8080/index?uge @server.route('/index',methods=['get','post'])#這句代碼的意思是下面這個函數將做爲服務裏的一個接口, # 再也不是一個普通的函數;調用這個接口時,就調用index這個路徑,methonds爲支持調用的方法, # 能夠post或get,也能夠都寫,也能夠不寫,不寫默認爲get方法 def index(): res={'msg':'這是我開發的第一個接口','msd_code':0}#這是一個字典,下面調用時要轉換成json串 return json.dumps(res,ensure_ascii=False) # server.run(port=7777,debug=True)#啓動服務,能夠指定端口號,不寫時默認爲5000,debug=True,改了代碼以後,不用重啓它會自動幫你重啓 #這時就能夠直接在瀏覽器訪問這個接口:http://127.0.0.1:7777/index
# *******第一個接口*******

# *******註冊用戶接口******* @server.route('/reg',methods=['post'])#post請求不能直接在瀏覽器訪問 def reg(): username=flask.request.values.get('username')#接收用戶輸入 pwd=flask.request.values.get('passwd')#接收用戶輸入 if username and pwd: sql='select * from my_user where username="%s";'%username #這裏由於%s未加雙引號致使sql執行失敗,sql必定要寫正確,切記切記 if my_db(sql): res={'msg':'用戶已存在','msg_code':2001} else: insert_sql='insert into my_user (username,passwd,is_admin) values ("%s","%s",0);'%(username,pwd) my_db(insert_sql) res={'msg':'註冊成功!','msg_code':0} else: res={'msg':'必填字段未填,請查看接口文檔!','msg_code':1001}#1001 必填字段未填 return json.dumps(res,ensure_ascii=False)
# *******註冊用戶接口*******
server.run(port=7777,debug=True,host='0.0.0.0')#啓動服務,能夠指定端口號,不寫時默認爲5000,debug=True,改了代碼以後,不用重啓它會自動幫你重啓 #在postman中輸入參數調用該註冊接口,可正確返回結果

瀏覽器調用結果:

 

postman調用註冊接口執行狀況:

註冊成功:

用戶已存在:

5、項目開發文件邏輯

單獨的一個python文件不叫程序,叫腳本;複雜的程序一般都會分目錄存儲,方便修改和查閱,提升代碼的可讀性。例如:bin目錄下放置啓動文件,啓動程序時直接執行該目錄下的文件便可;config目錄下放置配置文件,主要是一些端口或IP地址等;lib目錄下放置接口文件及本身開發的一些工具程序;log下存放日誌;data下放置初始化數據等;還應包含readme文件。

下面PS一片Linux下的目錄層級說明:

1.首先來介紹下根目錄下的一些重要目錄含義    注:其中被標記的比較重要。

 

目錄

說明

/bin

經常使用的二進制命令目錄。好比ls cp mkdir 等;和/usr/bin相似。

/boot

linux內核及引導系統程序所需的文件目錄。安裝系統分區的時候通常要分一個boot分區。常見分區爲:/boot 200M  swap內存的1.5倍,其他的都給/。

/dev

設備文件目錄,好比聲卡,磁盤,光驅等。

/etc

二進制安裝包的配置文件默認路徑和服務啓動命令存放的目錄。

/home

普通用戶的家目錄默認數據存放目錄。

/lib

庫文件存放目錄

/lost+found

在ext3文件系統中,當系統意外崩潰或機器意外關機,會產生一些文件碎片在這裏。當系統在開機啓動的過程當中fsck工具會檢查這裏,並修復已經損壞的文件系統。當系統發生問題,可能會有文件被移到這個目錄中,可能須要用手工的方式來修復,或移到文件到原來的位置上。

/mnt

通常是用於臨時掛載存儲設備的掛載目錄,好比有cdrom,U盤等目錄,直接插入光驅沒法使用,要先掛載後使用。

/opt

表示的是可選擇的意思,有些軟件包也會被安裝在這裏,也就是自定義軟件包,咱們本身編譯的軟件包,就能夠安裝在這個目錄中;經過源碼包安裝的軟件,能夠經過./configure --prefix=/opt/目錄,非必須這樣,視習慣或規範而定。

/proc

操做系統運行時,進程信息及內核信息(好比CPU,硬盤分區,內存信息等)存放在這裏。/proc目錄是假裝的文件系統proc的掛載目錄,proc並非真正的文件系統,它的定義能夠參見/etc/fstab。

/root

linux超級權限用戶root的家目錄。

/sbin

大多涉及系統管理的命令的存放,是超級權限用戶root可執行命令存放地,這個目錄和/usr/sbin,/usr/X11R6/sbin或/usr/local/sbin目錄是類似的。

/tmp

臨時文件目錄,有時用戶運行程序的時候,會產生臨時文件。/tmp就用來存放臨時文件的,權限比較特殊。

/usr

這個是系統存放程序的目錄,好比命令,幫助文件等。這個目錄下有不少的文件和目錄。當咱們安裝一個linux發行版官方提供的軟件包時,大多安裝在這裏。若是有涉及服務器配置文件的,會把配置文件安裝在/etc/目錄中。/usr目錄下包括涉及字體目錄/usr/share/fonts,幫助目錄/usr/share/man或者/usr/share/doc,普通用戶可執行文件目錄/usr/bin/或/usr/local/bin或/usr/X11R6/bin ,好比/usr/sbin,/usr/X11R6/sbin,/usr/local/sbin等,還有程序的頭文件存放目錄/usr/include。

/var

這個目錄的內容是常常變更的,看名字就知道,咱們能夠理解爲vary的縮寫,/var下有/var/log這是用來存放系統日誌的目錄,系統日誌路徑/var/log/messages。/var/www目錄是定義apache服務器站點存放目錄;/var/lib用來存放一些庫文件,好比mysql的,已經mysql數據庫的存放地。

   

 

 

 

 

 

2. /etc目錄下一些重要的目錄及文件說明

目錄

說明

/etc/sysconfig/network-scripts/ifcfg-eth0

配置網絡地址及GW等。

/etc/resolv.conf

設置本機的客戶端DNS

/etc/hosts

設定用戶IP與名字(或域名)的對應表,至關於本地LAN內DNS。

注:WIN的hosts文件地址:C:\windows\system32\drivers\etc\hosts

/etc/sysconfig/network

可修改機器名及網卡啓動等配置。

/etc/fstab

記錄開機要mount的文件系統

/etc/inittab

設定系統啓動時 init進程將系統設置成什麼樣的runlevel及加載相關的啓動文件設置。

/etc/exports

設定NFS系統用的配置文件路徑。

/etc/init.d

這個子目錄是用來存放系統或服務器以system V 模式啓動的腳本,這在以system V模式啓動或初始化的系統中常見。好比CentOS/RedHat。

/etc/xinit.d

若是服務器時經過xinetd模式運行的,它的腳本要放在這個目錄下。有些系統沒有這個目錄,好比slackware,有些老版本也沒有。在redhat/fedora中比較新的版本中存在。

/etc/profile

系統全局變量配置路徑。

/etc/issue

記錄用戶登陸前顯示的信息

/etc/motd

每次用戶登陸時,/etc/motd文件的內容會顯示在用戶的終端

/etc/group

設定用戶的組名與相關信息

/etc/passwd

帳號信息

/etc/shadow

密碼信息

/etc/sudoers

sudo命令的配置文件

/etc/securetty

設定哪些終端可讓root登陸

/etc/login.defs

全部用戶登陸時的缺省配置

/etc/modprobe.conf

內核模塊額外參數設定

/etc/rsyslog.conf(5系列爲syslog.conf)

日誌設置文件

/etc/DIR_COLORS

設定顏色

/etc/host.conf

文件說明用戶的系統如何查詢節點名,默認order hosts,bind

/etc/hosts.allow

設置容許使用inetd的機器使用

/etc/hosts.deny

設置不容許使用inetd的機器使用

/etc/protocols

系統支持的協議文件

/etc/X11

X Window 的配置文件

3. /var目錄下一些重要的目錄及文件說明

目錄

說明

/var

日誌文件

/var/log

各類系統日誌存放地

/var/log/messages

系統信息默認日誌文件,很是重要,按周自動輪詢

/var/log/secure

記錄登入系統存放信息的文件,按周自動輪詢,例如pop3,ssh,telnet,ftp等都會記錄在此。

/var/log/wtmp

記錄登錄者信息的文件,last

/var/spool/cron

定時任務crontab默認目錄,按用戶名命名的文件。

/var/spool/mail

系統用戶郵件存放目錄

/var/spool/clientmqueue

臨時郵件文件目錄,有不少緣由會致使這個目錄碎文件不少,好比crontab定時任務命令不加>/dev/null等,工做中偶爾會由於該目錄文件太多,致使/var/所在的分區inode數量被消耗盡,沒法寫入文件的狀況。

/var/lib/rpm

rpm套件安裝處

 

4. /usr目錄下一些重要的目錄及文件說明

 

目錄

 

說明

 

/usr/bin

 

這個目錄是可執行程序的目錄,當咱們從系統自帶的軟件包安裝一個程序時,他的可執行文件大多會放在這個目錄。類似的目錄是/usr/local/sbin

 

/usr/sbin

 

這個目錄也是可執行程序的目錄,但大多存放涉及系統管理的命令;類似目錄是/usr/local/sbin或/usr/X11R6/sbin等。

 

/usr/local

 

這個目錄通常是用來存放用戶自編譯安裝軟件的存放目錄,通常是經過源碼包安裝的軟件,若是沒有特別指定安裝目錄的話,通常是安裝在這個目錄中。至關於C:\Program files

 

/usr/local/bin

 

用戶安裝的小的應用程序,和一些在/usr/local目錄下大應用程序的符號連接。

 

/usr/local/sbin

 

系統全局環境目錄,可放置一些不須要加路徑執行的腳本等。

 

/usr/share

 

系統共用的東西存放地,好比/usr/share/doc和/usr/share/man幫助文件。

 

/usr/src

 

內核源碼存放目錄,好比下面有內核源碼目錄,好比linux,linux-2.XXX.XX目錄等。

 

/usr/bin

 

使用者可執行的binary file 的目錄。

 

/usr/lib &&/usr/local/lib

 

系統會使用到的函數庫。

5. /proc目錄下一些重要的目錄及文件說明

 

目錄

說明

/proc

虛擬目錄,是內存的映射

/proc/version

內核版本

/proc/sys/kernel

系統內核功能

/proc/cpuinfo

關於處理器的信息,如類型,廠家,型號,性能等。

/proc/meminfo

系統內存信息

/proc/devices

當前運行內核所配置的全部設備清單。

/proc/dma

當前正在使用的DMA通道

/proc/filesystems

當前運行內核所配置的文件系統

/proc/initerrupts

正在使用的中斷,和曾經有多少箇中斷。

/proc/ioports

當前正在使用的I/O端口。

/proc/loadavg

系統負載信息,uptime的結果。

相關文章
相關標籤/搜索