亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python連接MySQL并使用fetchall()方法過濾特殊字符

2020-01-04 17:37:57
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python連接MySQL的方法并講解了如何使用fetchall()方法過濾特殊字符,示例環境為Ubuntu操作系統,需要的朋友可以參考下
 

來一個簡單的例子,看Python如何操作數據庫,相比Java的JDBC來說,確實非常簡單,省去了很多復雜的重復工作,只關心數據的獲取與操作。
準備工作
需要有相應的環境和模塊:

  • Ubuntu 14.04 64bit
  • Python 2.7.6
  • MySQLdb

注意:Ubuntu 自帶安裝了Python,但是要使用Python連接數據庫,還需要安裝MySQLdb模塊,安裝方法也很簡單:

sudo apt-get install MySQLdb

然后進入Python環境,import這個包,如果沒有報錯,則安裝成功了:

pythonPython 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import MySQLdb>>>

Python標準的數據庫接口的Python DB-API(包括Python操作MySQL)。大多數Python數據庫接口堅持這個標準。不同的數據庫也就需要不同額模塊,由于我本機裝的是MySQL,所以使用了MySQLdb模塊,對不同的數據庫而言,只需要更改底層實現了接口的模塊,代碼不需要改,這就是模塊的作用。
Python數據庫操作
首先我們需要一個測試表
建表語句:

CREATE DATABASE study;use study;DROP TABLE IF EXISTS python_demo;CREATE TABLE python_demo ( id int NOT NULL AUTO_INCREMENT COMMENT '主鍵,自增', user_no int NOT NULL COMMENT '用戶編號', user_name VARBINARY(50) NOT NULL COMMENT '用戶名', password VARBINARY(50) NOT NULL COMMENT '用戶密碼', remark VARBINARY(255) NOT NULL COMMENT '用戶備注', PRIMARY KEY (id,user_no))ENGINE =innodb DEFAULT CHARSET = utf8 COMMENT '用戶測試表';INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1001,'張三01','admin','我是張三');INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1002,'張三02','admin','我是張三');INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1003,'張三03','admin','我是張三');INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1004,'張三04','admin','我是張三');INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1005,'張三05','admin','我是張三');INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1006,'張三06','admin','我是張三');INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1007,'張三07','admin','我是張三');INSERT INTO python_demo(user_no, user_name, password, remark) VALUES (1008,'張三08','admin','我是張三');

Python代碼

# --coding=utf8--import ConfigParserimport sysimport MySQLdbdef init_db():  try:    conn = MySQLdb.connect(host=conf.get('Database', 'host'),                user=conf.get('Database', 'user'),                passwd=conf.get('Database', 'passwd'),                db=conf.get('Database', 'db'),                charset='utf8')    return conn  except:    print "Error:數據庫連接錯誤"    return Nonedef select_demo(conn, sql):  try:    cursor = conn.cursor()    cursor.execute(sql)    return cursor.fetchall()  except:    print "Error:數據庫連接錯誤"    return Nonedef update_demo():  passdef delete_demo():  passdef insert_demo():  passif __name__ == '__main__':  conf = ConfigParser.ConfigParser()  conf.read('mysql.conf')  conn = init_db()  sql = "select * from %s" % conf.get('Database', 'table')  data = select_demo(conn, sql)  pass

fetchall()字段特殊字符過濾處理
最近在做數據倉庫的遷移工作,之前數據倉庫的數據都是用的shell腳本來抽取,后來換了python腳本.
但是在把數據抽取存放到hadoop時,出現了一個問題:
由于數據庫字段很多,提前也不知道數據庫字段會存儲什么內容,hive建表是以/t/n做分隔,這就導致了一個問題,如果mysql字段內容里面本身含有/t/n,那么就會出現字段錯位情況,并且很頭疼的是mysql有100多個字段,也不知道哪個字段會出現這個問題.
shell腳本里的做法是在需要抽取的字段上用mysql的replace函數對字段進行替換,例如,假設mysql里的字段是column1 varchar(2000),那么很可能就會出現有特殊字符的情況,在查詢的sql語句里加上

select replace(replace(replace(column1,'/r',''),'/n',''),'/t','')

之前一直是這么干的,但是這樣寫sql特別長,特別是有100多個字段,也不知道哪個有特殊字符,只要都加上.
所以在python中對字段不加處理,最終導致hive表字段對應出現偏差,所以在python里從mysql查詢到的字段在寫到文件之前需要對每個字段進行過濾處理
看個例子,我就以mysql測試為例,首先建一張測試表

CREATE TABLE `filter_fields` ( `field1` varchar(50) DEFAULT NULL, `field2` varchar(50) DEFAULT NULL, `field3` varchar(50) DEFAULT NULL, `field4` varchar(50) DEFAULT NULL, `field5` varchar(50) DEFAULT NULL, `field6` varchar(50) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

有六個字段,都是varchar類型,插入新數據可以在里面插入特殊字符.簡單插入條數據測試看看:

insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test01','test02','test03','test04','test05','test06');insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test11/ntest11','test12/n/n','test13','test14','test15','test16');insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test21/ttest21','test22/ttest22/ttest22','test23/t/t/t','test4','test5','test6');insert into filter_fields(field1,field2,field3,field4,field5,field6) VALUES('test21/rest21','test22/r/rest22/r/rest22','test23/r/r/r','test4','test5','test6');

其中數據里插入的特殊字符,可能連在一起,也有不連在一起的.
python測試代碼:

# coding=utf-8import MySQLdbimport sysdb_host = '127.0.0.1'  # 數據庫地址db_port = 3306     # 數據庫端口db_user = 'root'    # mysql用戶名db_pwd = 'yourpassword' # mysql用戶密碼,換成你的密碼db_name = 'test'    # 數據庫名db_table = 'filter_fields' # 數據庫表# 過濾sql字段結果中的/t/ndef extract_data(table_name):  try:    conn = MySQLdb.connect(host=db_host, port = db_port, user=db_user,                passwd = db_pwd, db = db_name, charset = "utf8")    cursor = conn.cursor()  except MySQLdb.Error, e:    print '數據庫連接異常'    sys.exit(1)  try:    sql = 'select * from %s;'%(table_name)    cursor.execute(sql)    rows = cursor.fetchall()    print '====字段未過濾查詢結果===='    for row in rows:      print row    print '====字段過濾之后結果===='    rows_list = []    for row in rows:      row_list = []      for column in row:        row_list.append(column.replace('/t', '').replace('/n', '').replace('/r', ''))      rows_list.append(row_list)      print rows_list[-1] # [-1]表示列表最后一個元素    return rows_list  except MySQLdb.Error, e:    print '執行sql語句失敗'    cursor.close()    conn.close()    sys.exit(1)if __name__ == '__main__':  print 'begin:'  rows = extract_data(db_table)  pass

看看輸出結果:

字段未過濾查詢結果

(u'test01', u'test02', u'test03', u'test04', u'test05', u'test06')(u'test11/ntest11', u'test12/n/n', u'test13', u'test14', u'test15', u'test16')(u'test21/ttest21', u'test22/ttest22/ttest22', u'test23/t/t/t', u'test4', u'test5', u'test6')(u'test21/rest21', u'test22/r/rest22/r/rest22', u'test23/r/r/r', u'test4', u'test5', u'test6')

字段過濾之后結果

[u'test01', u'test02', u'test03', u'test04', u'test05', u'test06'][u'test11test11', u'test12', u'test13', u'test14', u'test15', u'test16'][u'test21test21', u'test22test22test22', u'test23', u'test4', u'test5', u'test6'][u'test21est21', u'test22est22est22', u'test23', u'test4', u'test5', u'test6']

可以看到,制表符,換行符,回車都被過濾了.
建議:最后說點題外話,不要小視/r,回車符.很多人以為回車符就是換行符,其實不是的,/r表示回車符,/n表示新行.之前代碼里其實是過濾掉了/t/n的,但是抽取的數據還是不對,后來看了源碼之后才發現,原來是沒有過濾/r,就這個不同導致了很多數據抽取不對.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色在线视频| 亚洲日本欧美中文幕| 欧美夜福利tv在线| 69久久夜色精品国产7777| 91精品国产91久久久久久久久| 成人中文字幕在线观看| 久久亚洲欧美日韩精品专区| 亚洲男人天堂网站| 欧美—级a级欧美特级ar全黄| 国产亚洲美女精品久久久| 精品国产精品三级精品av网址| 一夜七次郎国产精品亚洲| 欧美俄罗斯性视频| 久久五月情影视| 国产精品91在线观看| 亚洲福利影片在线| 91在线精品播放| 亚洲综合在线小说| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美激情在线视频| 亚洲美女av电影| 色阁综合伊人av| 成人精品网站在线观看| 色哟哟亚洲精品一区二区| 欧美性视频网站| 黄色一区二区三区| 国产亚洲一区二区在线| 久久久久久12| 裸体女人亚洲精品一区| 91夜夜未满十八勿入爽爽影院| 亚洲第一天堂无码专区| 热99久久精品| 欧亚精品在线观看| 国产视频久久久| 欧美性受xxxx白人性爽| 久久久亚洲网站| 国内精品久久久久影院 日本资源| 5278欧美一区二区三区| 久久99热精品这里久久精品| 国产精品69av| 欧美激情国产日韩精品一区18| 亚洲一区二区三区四区视频| 欧美男插女视频| 国内成人精品视频| 欧美成人精品xxx| 日韩成人免费视频| 欧美黑人又粗大| 欧美在线视频一区| 中文字幕日韩免费视频| 亚洲欧美综合精品久久成人| 日韩精品有码在线观看| 日韩av免费在线| 亚洲国产欧美一区二区三区同亚洲| 久久好看免费视频| 97国产精品视频人人做人人爱| 精品亚洲国产成av人片传媒| 伊人成人开心激情综合网| 日韩在线视频观看| 国产精品亚发布| 国产精品男人爽免费视频1| 久久精品国产欧美亚洲人人爽| 91成品人片a无限观看| 国产精品盗摄久久久| 亚洲免费高清视频| 97国产在线视频| 欧美资源在线观看| 亚洲成年人在线| 欧美多人爱爱视频网站| 日本亚洲精品在线观看| 日韩第一页在线| 日韩av123| 91日韩在线播放| 91夜夜未满十八勿入爽爽影院| 久久久久久久香蕉网| 亚洲精品wwwww| 国产精品ⅴa在线观看h| 欧美中文在线免费| 中文字幕在线视频日韩| 亚洲成人av中文字幕| 久久五月情影视| 久久久国产一区| 国产97在线视频| 国产一级揄自揄精品视频| 国产日韩精品视频| www欧美日韩| 亚洲石原莉奈一区二区在线观看| 91精品国产成人| 亚洲美女精品成人在线视频| 精品久久久久久久久国产字幕| 中文字幕在线看视频国产欧美| 奇米成人av国产一区二区三区| 欧美巨猛xxxx猛交黑人97人| 全亚洲最色的网站在线观看| 欧美乱大交做爰xxxⅹ性3| 久久人人爽亚洲精品天堂| 国产区亚洲区欧美区| 日韩av在线免播放器| 国自产精品手机在线观看视频| 欧美激情视频网| 亚洲精品久久久久久久久久久久久| 成人做爰www免费看视频网站| 欧美激情精品久久久久| 欧美在线视频免费观看| 国产日韩精品视频| 成人午夜一级二级三级| 色偷偷偷亚洲综合网另类| 欧美香蕉大胸在线视频观看| 91免费视频国产| 日韩中文字幕不卡视频| 欧美贵妇videos办公室| 久久国产精品久久国产精品| 亚洲一区www| 久久九九精品99国产精品| 久久久久久亚洲| 日韩欧美在线观看视频| 热门国产精品亚洲第一区在线| 亚洲最大福利视频网| 欧美视频二区36p| 日本中文字幕久久看| 亚洲精品国精品久久99热| 日韩av手机在线| 欧美高清在线视频观看不卡| 欧美中文在线字幕| 欧美精品久久久久久久| 亚洲黄在线观看| 久久视频在线免费观看| 日韩中文综合网| 日本国产欧美一区二区三区| 黄色成人av在线| …久久精品99久久香蕉国产| 国产精品国产自产拍高清av水多| 欧美成人精品三级在线观看| 欧美一级电影在线| 欧美亚洲激情视频| 57pao国产成人免费| 91精品国产91久久久久久最新| 亚洲精品视频在线播放| 亚洲国产精品99| 17婷婷久久www| 日韩av网站在线| 亚洲xxx大片| 精品国产欧美一区二区三区成人| 91在线看www| 国产精品香蕉在线观看| 午夜精品理论片| 国产精品视频免费在线| 国产国语videosex另类| 国内精品久久久久影院优| 精品国产31久久久久久| 欧美wwwxxxx| 日韩欧美国产视频| 国产精品永久免费视频| 亚洲免费视频一区二区| 亚洲第一天堂无码专区| 懂色av一区二区三区| 亚洲精品国产精品国自产观看浪潮| 欧洲美女7788成人免费视频| 国产日产久久高清欧美一区| 中文字幕9999| 亚洲欧美色婷婷| 日韩有码在线播放| 亚洲第一国产精品| 久久国产精品影视| 亚洲精品短视频|