前段時(shí)間發(fā)現(xiàn)了一個(gè)好玩的東西残家,一個(gè)python的第三方庫(kù)itchat泣港,它的功能很強(qiáng)大兽间。只要你掃一下它所生成的二維碼即可模擬登陸你的微信號(hào)历葛,然后可以實(shí)現(xiàn)自動(dòng)回復(fù),爬取微信列表好友信息等功能嘀略⌒羧埽基于這個(gè)第三方庫(kù),寫了個(gè)兩百行的代碼屎鳍。
廢話不多說宏娄,先貼代碼。這份代碼復(fù)制粘貼就可以用逮壁,不過要注意改一下代碼中所設(shè)置的文件路徑孵坚。
python3+mysql+pycharm開發(fā)環(huán)境粮宛。
代碼
#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#__author__='跌跌撞撞小紅豆'
#__date__ = '2018-03-18'
import itchat
import pymysql.cursors
from matplotlib import pyplot as plt
import numpy as np
import ch
import jieba.analyse
Nickname1 = []
Remarkname1 = []
Sex1 = []
Province1 = []
Signature1 = []
province_distribution = []
db = 'new_schema'
Province_dict = {'北京': 0, '上海': 0, '天津': 0, '重慶': 0, '黑龍江': 0, '吉林': 0, '遼寧': 0, '內(nèi)蒙古': 0, '河北': 0,
'山東':0, '河南':0, '安徽':0,'江蘇':0, '浙江':0, '福建':0, '廣東':0, '湖南':0, '湖北':0, '江西':0,
'寧夏':0, '甘肅':0, '新疆':0, '西藏':0, '青海':0, '四川':0,'云南':0, '貴州':0, '廣西':0, '山西':0,
'陜西':0, '海南':0, '臺(tái)灣':0 }
Province_tuple = ['北京', '上海', '天津', '重慶', '黑龍江', '吉林', '遼寧', '內(nèi)蒙古', '河北',
'山東', '河南', '安徽','江蘇', '浙江', '福建', '廣東', '湖南', '湖北', '江西',
'寧夏', '甘肅', '新疆', '西藏', '青海', '四川','云南', '貴州', '廣西', '山西',
'陜西', '海南', '臺(tái)灣']
def login():
itchat.auto_login()
def crawl():
male = 0
female = 0
unknow = 0
for friend in itchat.get_friends(update=True)[0:]:
#可以用此句print查看好友的微信名、備注名卖宠、性別巍杈、省份、個(gè)性簽名(1:男 2:女 0:性別不詳)
print(friend['NickName'],friend['RemarkName'], friend['Sex'], friend['Province'], friend['Signature'])
Nickname1.append(friend['NickName'])
Remarkname1.append(friend['RemarkName'])
Sex1.append(friend['Sex'])
Province1.append(friend['Province'])
Signature1.append(friend['Signature'])
img = itchat.get_head_img(userName=friend["UserName"])
path = "C:/HeadImages_zyh/"+friend['NickName']+"("+friend['RemarkName']+").jpg"
try:
with open(path,'wb') as f:
f.write(img)
except Exception as e:
print(repr(e))
if friend['Sex'] == 1:
male += 1
else:
if friend['Sex'] == 2:
female += 1
else:
unknow += 1
print('您的微信賬號(hào)里有男性:' + str(male) + ' 女性:' + str(female) + ' 性別不知者: ' + str(unknow))
def store_mysql():
print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
# 通過cursor創(chuàng)建游標(biāo)
cursor = connection.cursor()
print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功扛伍!正在寫入數(shù)據(jù)筷畦,請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
for i in range(len(Remarkname1)):
sql = '''INSERT INTO `my_friends` (`Nickname`, `Remarkname`, `Sex`, `Province`, `Signature`) VALUES ("%s", "%s", "%d", "%s", "%s")''' % (Nickname1[i],Remarkname1[i],Sex1[i],Province1[i],Signature1[i])
cursor.execute(sql)
# 提交SQL
connection.commit()
cursor.close()
connection.close()
def select_sex():
print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
# 通過cursor創(chuàng)建游標(biāo)
cursor = connection.cursor()
print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功!正在提取數(shù)據(jù)刺洒,請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
sql = "select (id) from `my_friends`"
cursor.execute(sql)
sum = len(cursor.fetchall())
print("共計(jì)數(shù)據(jù)" + str(sum) + "條")
global man, woman, unknown
man = woman = unknown = 0
for i in range(sum):
sql = "select Sex from `my_friends` where id =" + str(i+1)
cursor.execute(sql)
dict = cursor.fetchone()
print(dict)
if dict['Sex'] == 1:
man += 1
if dict['Sex'] == 2:
woman += 1
if dict['Sex'] == 0:
unknown += 1
print(man,woman,unknown)
print(1)
connection.commit()
cursor.close()
connection.close()
def figure_sex():
fig = plt.figure(1)
ax1 = plt.subplot(111)
data = np.array([man, woman, unknown])
width = 0.5
x_bar = np.arange(3)
rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue")
for rec in rect:
x = rec.get_x()
height = rec.get_height()
ax1.text(x + 0.2, 1.02 * height, str(height))
ax1.set_xticks(x_bar)
ax1.set_xticklabels(("man", "woman", "unknown"))
ax1.set_ylabel("number")
ax1.set_title("your friend's sex distribution")
ax1.grid(True)
ax1.set_ylim(0, 200)
plt.show()
def select_province():
andso_on = 0
overseas = 0
total = 0
print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
cursor = connection.cursor()
print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功鳖宾!正在提取數(shù)據(jù),請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
sql = "select (Province) from `my_friends`"
cursor.execute(sql)
sum = len(cursor.fetchall())
print("共計(jì)數(shù)據(jù)" + str(sum) + "條")
for i in range(sum):
sql = "select Province from my_friends where id =" + str(i+1)
cursor.execute(sql)
dict = cursor.fetchone()
province = dict['Province']
if province in Province_tuple:
Province_dict[province] += 1
if province == '':
overseas += 1
if province != ''and province not in Province_tuple:
andso_on += 1
#print(Province_dict) 真沒想到可以如此簡(jiǎn)單的就成功計(jì)數(shù)好友在每個(gè)省的分布逆航,是自己寫程序無(wú)意中想到的鼎文,之前一直思考都沒有這個(gè)靈光閃現(xiàn)∫蚶可見有時(shí)候編代碼和做數(shù)學(xué)題一樣拇惋,不能只看,要邊動(dòng)手邊想Dㄊ!3盘!
for i in range(32):
province_distribution.append(Province_dict[Province_tuple[i]])
province_distribution.append(overseas)
province_distribution.append(andso_on)
for i in range(len(province_distribution)-2):
total = total + province_distribution[i]
print(province_distribution)
connection.commit()
cursor.close()
connection.close()
def figure_province():
Province_tuple.append('unknow')
Province_tuple.append('abroad')
fig = plt.figure(1)
ax1 = plt.subplot(111)
data = province_distribution
width = 0.5
x_bar = np.arange(len(province_distribution))
rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue")
for rec in rect:
x = rec.get_x()
height = rec.get_height()
ax1.text(x + 0.1, 1.02 * height, str(height))
ax1.set_xticks(x_bar)
ax1.set_xticklabels(Province_tuple)
ax1.set_ylabel("number")
ax1.set_title("my friend's location distribution")
ax1.grid(True)
ax1.set_ylim(0, 100)
plt.show()
def judge_chinese(word):
cout1 = 0
for char in word:
if ord(char) not in (97, 122) and ord(char) not in (65, 90):
cout1 += 1
if cout1 == len(word):
return word
def jiebaSet(strs):
tags = jieba.analyse.extract_tags(strs, topK=100, withWeight=True)
for item in tags:
print(item[0] + '\t' + str(int(item[1]*1000)))
def select_signature():
cout = 0
Sig = []
strs = ''
print('~~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db=db,
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
cursor = connection.cursor()
print('~~~~~~~~~~~~~~~~~~~~~~~~~連接數(shù)據(jù)庫(kù)成功澳眷!正在提取數(shù)據(jù)胡嘿,請(qǐng)等待~~~~~~~~~~~~~~~~~~~~~~~~~~~~`')
sql = "select (id) from `my_friends`"
cursor.execute(sql)
sum = len(cursor.fetchall())
for i in range(sum):
sql = "select Signature from `my_friends` where id =" + str(i + 1)
cursor.execute(sql)
dict = cursor.fetchone()
if dict['Signature'] == '':
cout += 1
else:
Sig.append(dict['Signature'])
print('有' + str(cout) + '人沒有寫個(gè)性簽名')
for word in Sig[0:]:
judge_chinese(word)
if judge_chinese(word) != None:
print(judge_chinese(word))
strs += word
jiebaSet(strs)
login()
crawl()
itchat.run()
store_mysql()
select_sex()
figure_sex()
ch.set_ch()
select_province()
figure_province()
select_signature()
接下來(lái)我們開始一點(diǎn)點(diǎn)分析這些代碼,以及分享一下我寫代碼過程中遇到的困難钳踊,坑和感受
登陸
第一個(gè)函數(shù)login()沒有什么好說的灶平,這是itchat封裝好的,調(diào)用后可以直接生成一個(gè)二維碼箍土,這個(gè)二維碼其實(shí)就是你平時(shí)登陸web微信時(shí)候的二維碼,你用手機(jī)微信掃這個(gè)二維碼后罐监,程序會(huì)模擬成你登陸進(jìn)微信吴藻,進(jìn)而對(duì)微信進(jìn)行一系列操作。
爬取
crawl()所實(shí)現(xiàn)的功能是爬取你微信列表所有好友的信息弓柱,這些信息包括頭像沟堡,昵稱,備注矢空,性別航罗,所在地以及個(gè)性簽名(昵稱和個(gè)性簽名里有微信表情真的是讓人頭疼,這個(gè)后面再說)以及爬取后儲(chǔ)存頭像在指定路徑和可視化微信好友男女比例的功能屁药。
唉粥血,沒想到我雖然是個(gè)漢子,好友列表里竟然女生比男生多,而且竟然還有這么多個(gè)不知道性別的复亏。
path = "C:/HeadImages_zyh/"+friend['NickName']+"("+friend['RemarkName']+").jpg"
這行代碼所描述的就是指定的存儲(chǔ)微信頭像的路徑趾娃。
因?yàn)轭l繁爬取微信會(huì)讓騰訊把你web端微信給封掉,所以我想把所爬取的數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)中缔御,這樣以后分析數(shù)據(jù)可以直接從數(shù)據(jù)庫(kù)里提取抬闷,而不需要一直現(xiàn)爬現(xiàn)分析。
鏈接數(shù)據(jù)庫(kù)
store_mysql()就是實(shí)現(xiàn)這樣一個(gè)功能耕突。只需要簡(jiǎn)單學(xué)習(xí)幾句sql語(yǔ)句就可以滿足本程序的使用笤成。
在這里給大家提供幾個(gè)常用的并且在這個(gè)程序中使用到了的sql語(yǔ)句,供大家查閱研究使用眷茁。
truncate table 表名炕泳;#刪除表中所有數(shù)據(jù)
create table 表名
(id int(10) not null primary key auto_increment) #給表增加索引,而且沒插入一條數(shù)據(jù)索引自增1
alter table 表名 add 字段名 字段類型
數(shù)據(jù)庫(kù)操作是一門表面看起來(lái)簡(jiǎn)單蔼卡,其實(shí)很繁雜且容易出錯(cuò)的學(xué)問喊崖。舉個(gè)例子吧。
a='', b=' ', c=null
請(qǐng)問將這三個(gè)變量插入數(shù)據(jù)庫(kù)會(huì)有什么不同呢雇逞?答案告訴大家荤懂,c是不占內(nèi)存的,意味著什么也沒有塘砸,好比真空节仿。a呢,它是個(gè)空字符串掉蔬,但是它是有內(nèi)存地址的廊宪,只不過這個(gè)字符串是空的,好比我們生存空間里的空氣女轿,看不見摸不著箭启,其實(shí)它是占用空間的。b也是個(gè)字符串蛉迹,但它不是空的傅寡,而是只有一個(gè)空格字符的字符串。
是不是聽暈了北救?哈哈荐操,仔細(xì)體會(huì),編程中有許多這樣小的細(xì)節(jié)珍策,不注意區(qū)分就會(huì)產(chǎn)生你很難察覺的bug托启。
我在將信息插入數(shù)據(jù)庫(kù)的時(shí)候,卻遇到了一個(gè)大麻煩攘宙。mysql數(shù)據(jù)庫(kù)默認(rèn)編碼是utf8屯耸,然后我所要插入信息中的微信昵稱拐迁,微信個(gè)性簽名里存在的大量表情是由utf8mb4支持的,utf8mb4是utf8的一個(gè)超集肩民。所以我需要更改數(shù)據(jù)庫(kù)默認(rèn)編碼才行唠亚。
給大家科普一下我們?cè)诰幊踢^程中經(jīng)常遇到的編碼問題。到底經(jīng)常報(bào)錯(cuò)的utf8持痰,gb2312灶搜,unicode都是些什么東西呢?
最先美國(guó)人發(fā)明計(jì)算機(jī)時(shí)只把26個(gè)英文字母大小寫工窍,標(biāo)點(diǎn)符號(hào)割卖,數(shù)字等進(jìn)行了編碼,這就是大家C語(yǔ)言入門時(shí)都知道的ASCII碼患雏。后來(lái)計(jì)算機(jī)普及鹏溯,中國(guó)人為了能讓漢字可以表示,就改動(dòng)了ASCII碼淹仑,并加入了常用漢字?jǐn)?shù)千個(gè)丙挽,這就是GB2312。
再后來(lái)匀借,滿文颜阐,日文,藏文等等又不停的加入吓肋,一些不常用的漢字(后來(lái)發(fā)現(xiàn)必須加凳怨,因?yàn)楹芏嗝说拿侄际遣怀S玫臐h字等等情況)也加入了進(jìn)去,GB2312就發(fā)展成為了GB18030是鬼。
到了最后階段肤舞,信息時(shí)代來(lái)了,每個(gè)國(guó)家都知道要抓住機(jī)遇均蜜,大力發(fā)展互聯(lián)網(wǎng)李剖,因此每個(gè)國(guó)家對(duì)自己文字的編碼便應(yīng)運(yùn)而生。當(dāng)真時(shí)百花齊放百家爭(zhēng)鳴囤耳。我們?cè)诰幊讨泄馐怯h轉(zhuǎn)換就已經(jīng)夠煩的了杖爽,難道出差去埃薩俄比亞還要轉(zhuǎn)成埃薩俄比亞的編碼嘛?于是一個(gè)國(guó)際組織就把全世界所有已知的字符符號(hào)海納百川紫皇,全部包括進(jìn)一種編碼,這就是unicode腋寨。
以上這些從通信角度說都是信源編碼聪铺,而utf8和utf8bm4都是信道編碼。他們包含了一些壓縮編碼的規(guī)則以便在傳輸中最大限度的降低空間占用率萄窜。
接下來(lái)講述一下我在更改數(shù)據(jù)庫(kù)默認(rèn)編碼時(shí)候遇到的問題铃剔。從網(wǎng)上搜索撒桨,說是要更改一個(gè)叫做my.ini的文件,它涉及到數(shù)據(jù)庫(kù)剛剛啟動(dòng)時(shí)候的初始化键兜。結(jié)果我第一步就卡了很久凤类,就是我怎么也找不到這個(gè)文件。費(fèi)了很大勁才發(fā)現(xiàn)它原來(lái)在隱藏文件夾ProgramData中普气,至于如何讓隱藏文件夾出現(xiàn)谜疤,自行百度吧。
我是如何發(fā)現(xiàn)它在隱藏文件夾中的呢现诀?
控制面板->管理工具->服務(wù)里夷磕,找到你正在運(yùn)行的mysql服務(wù),右鍵點(diǎn)擊屬性仔沿,然后就會(huì)發(fā)現(xiàn)一個(gè)路徑坐桩,這個(gè)路徑就是mysql啟動(dòng)時(shí)候初始化配置文件my.ini的路徑。之所以說它是因?yàn)樗苤匾怙保煌姹镜膍ysql或者不同的系統(tǒng)這個(gè)文件位置是不一樣的绵跷,需要到這里來(lái)找到它。
找到文件后更改相應(yīng)位置的內(nèi)容就可以了成福。
如果想查看自己的更改是否有效果碾局,可以以管理員權(quán)限啟動(dòng)命令行然后進(jìn)行如下操作。
如上圖所示就對(duì)了闷叉。
然后緊接著就是重新啟動(dòng)mysql擦俐,你更改了配置必須要重新啟動(dòng)才可以生效∥詹啵可是我在重新啟動(dòng)這個(gè)地方真的是遇到了一個(gè)大坑蚯瞧,可是說出來(lái)也好笑。
mysql下載下來(lái)后是有兩個(gè)服務(wù)進(jìn)程的品擎,一個(gè)叫MySQL埋合,一個(gè)叫MySQL57。而且在控制面板之前那個(gè)服務(wù)里我們看到萄传,MySQL叫做本地系統(tǒng)甚颂,MySQL57是網(wǎng)絡(luò)服務(wù)。我想當(dāng)然的認(rèn)為MySQL是我現(xiàn)在存儲(chǔ)數(shù)據(jù)所用的服務(wù)進(jìn)程秀菱。
執(zhí)行命令net stop mysql無(wú)效振诬,于是我又從網(wǎng)上查了各種攻略,又把mysql和mysql workbench安裝刪除了好幾遍衍菱,真可謂是精通mysql的安裝與刪除了才發(fā)現(xiàn)原來(lái)我一開始服務(wù)進(jìn)程都搞錯(cuò)了赶么,直接輸入net stop mysql57就可以了。
本以為可以出現(xiàn)奇跡脊串,結(jié)果還是存儲(chǔ)失敗了辫呻。又是一頓百度清钥,找到了一個(gè)比較完美的答案。
我們還需要繼續(xù)實(shí)驗(yàn)放闺,仔細(xì)看修改配置文件里init_connect='SETNAMES utf8mb4'祟昭,那我可以拿來(lái)用到數(shù)據(jù)庫(kù)中。果然怖侦,發(fā)現(xiàn)加上“SET NAMES utf8mb4;”這句以后篡悟,數(shù)據(jù)庫(kù)變成了utf8mb4.:在python + mysqldb 或者 python +sqlalchemy兩種模式都適用。創(chuàng)建連接以后础钠,游標(biāo)對(duì)象首先要執(zhí)行一遍“SET NAMES utf8mb4;”這樣就能保證數(shù)據(jù)庫(kù)連接是以u(píng)tf8mb4編碼格式連接恰力,數(shù)據(jù)庫(kù)也就變成utf8mb4的啦。前面都是鋪墊的內(nèi)容旗吁,如果沒有這一步踩萎,前面都是白做的。
數(shù)據(jù)可視化
存儲(chǔ)到數(shù)據(jù)庫(kù)成功以后很钓,接下來(lái)要做的就是如何從數(shù)據(jù)庫(kù)中提取消息香府,并加以利用。我主要對(duì)信息進(jìn)行了兩個(gè)方面的利用码倦,一個(gè)是將所有好友的所在地進(jìn)行分析企孩,并做成條形圖。一個(gè)是將所有好友的個(gè)性簽名進(jìn)行中文分詞袁稽,然后做成詞云來(lái)觀察我好友都在說些什么勿璃?
程序的邏輯很清晰,select_province所做的是從數(shù)據(jù)庫(kù)中提取信息推汽,figure_province是利用畫圖补疑。這個(gè)功能難度不大,不過涉及到一個(gè)細(xì)節(jié)歹撒,就是我們拿到了每個(gè)好友的所在地信息莲组,難道要每次都判斷一遍他們是不是在我國(guó)三十多個(gè)行政區(qū)嘛?這樣無(wú)疑太浪費(fèi)時(shí)間暖夭,無(wú)論是開發(fā)效率還是運(yùn)行效率都不高锹杈。
于是我巧用字典,然后解決了需要頻繁判斷的問題迈着。
首先分別初始化自定義一個(gè)字典和一個(gè)列表竭望。
Province_dict = {'北京': 0, '上海': 0, '天津': 0, '重慶': 0, '黑龍江': 0, '吉林': 0, '遼寧': 0, '內(nèi)蒙古': 0, '河北': 0,
'山東':0, '河南':0, '安徽':0,'江蘇':0, '浙江':0, '福建':0, '廣東':0, '湖南':0, '湖北':0, '江西':0,
'寧夏':0, '甘肅':0, '新疆':0, '西藏':0, '青海':0, '四川':0,'云南':0, '貴州':0, '廣西':0, '山西':0,
'陜西':0, '海南':0, '臺(tái)灣':0 }
Province_tuple = ['北京', '上海', '天津', '重慶', '黑龍江', '吉林', '遼寧', '內(nèi)蒙古', '河北',
'山東', '河南', '安徽','江蘇', '浙江', '福建', '廣東', '湖南', '湖北', '江西',
'寧夏', '甘肅', '新疆', '西藏', '青海', '四川','云南', '貴州', '廣西', '山西',
'陜西', '海南', '臺(tái)灣']
字典的key是我國(guó)三十多個(gè)行政區(qū)的名字,而值所代表的是我朋友所在這些地方的個(gè)數(shù)裕菠,初始化為0咬清。數(shù)據(jù)庫(kù)里是以{province :'所在地'}的形式存儲(chǔ)的,所以利用dict['province']來(lái)判斷該字典值是否在Province_tuple這個(gè)列表里,如果在的話Province_dict[province] += 1枫振。畫圖的時(shí)候直接取出字典值畫圖就可以了。(不知道表達(dá)的是否清晰萤彩,盡力了啊粪滤,也需要大家仔細(xì)看,自行體會(huì)雀扶。)
從圖里可以很直觀的看出來(lái)杖小,我的朋友在北京,山東愚墓,安徽分布最多予权。人對(duì)圖像是最敏感的,所以想要成為一個(gè)很好的數(shù)據(jù)分析師要有很強(qiáng)大的數(shù)據(jù)可視化能力浪册,這知識(shí)數(shù)據(jù)可視化的冰山一角啦扫腺。
最后還有一個(gè)詞云的功能,我引入了jieba分詞包加上自己處理村象,將所有個(gè)性簽名分成一個(gè)一個(gè)詞笆环,包括英文,日文特殊符號(hào)等等厚者。
可以看出來(lái)躁劣,自由,生活库菲,自我這些詞是在我朋友個(gè)性簽名中最頻繁使用的账忘,這不正是90后張揚(yáng)自我的標(biāo)簽嘛?
是不是挺有趣熙宇,心動(dòng)不如行動(dòng)鳖擒,自己實(shí)驗(yàn)一下吧。
PS
有人反映其中ch.py這個(gè)包安裝不了奇颠。解釋一下败去,這個(gè)包是我自己寫的,所以當(dāng)然安裝不了烈拒,而且我忘了把這個(gè)包公布圆裕。其實(shí)這個(gè)包不涉及程序邏輯,這個(gè)包的功能就是解決一些圖像顯示的問題荆几。
以下是代碼
#-*-coding:utf-8-*-
#文件名: ch.py
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認(rèn)字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問題</span>