写在前面:
之前了解过一点python,前两天看了一篇文章,一件有趣的事:我用 Python 爬了爬自己的微信朋友,感觉还挺有意思的,不过文章看完了,自己敲代码的时候还是有点坑踩进去的,所以我写篇文章来填坑啦!顺便把省份统计拿出来做个范例。
正文
pip install itchat
,pip install pandas
安装依赖。
多说一句,一般写python都会在文件开头加一句
#coding=utf8
coding和后面的等于号之间不要有空格。
首先安装了这个包之后小试牛刀,打印一下男女人数并且利用pandas输出好友列表文件。
#coding=utf8
import itchat
def get_var(var): #定义获取变量的方法
variable = []
for i in friends:
value = i[var]
variable.append(value)
return variable
itchat.login() # 实现登录功能,会弹出一个二维码让你扫描
friends = itchat.get_friends(update=True)[0:] #获取好友列表
male = female = other = 0
for i in friends[1:]:
sex = i['Sex']
if sex == 1:
male += 1
elif sex == 2:
female += 1
else:
other += 1
total = len(friends[1:])
print(male)
print(female)
print(other)
NickName = get_var('NickName') #昵称
Sex = get_var('Sex')
Province = get_var('Province')
City = get_var('City')
Signature = get_var('Signature')
from pandas import DataFrame
data = {'NickName': NickName, 'Sex': Sex,
'Province': Province, 'City': City, 'Signature': Signature}
frame = DataFrame(data)
frame.to_csv('data.csv', index=True) #输出csv文件
上面这段代码没啥问题,主要是啥呢,这个csv文件是个乱码!怎么读取这个文件呢?下面我们分两种情况来介绍:
第一种,直接读取csv文件。
首先这个乱码问题得解决吧,这个时候推荐文件的打开方式为一个编辑器,什么notepad++啊,sublime啊,或者vscode然后选择保存格式为UTF-8,具体操作针对不同编辑器方式各异,大家可自行搜索,学会搜索是成为一个优秀程序员的秘技。格式修改过来了自然也就不乱码了。
data.csv
和本文件都放到桌面上了,所以路径直接读取就好。
#coding=utf8
# 解析csv,本文件是用于解析微信好友列表
import csv
import io #自带
import sys #自带
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
exampleFile = open('data.csv','r', encoding='UTF-8')
exampleReader = csv.reader(exampleFile)
provinces = {}
for row in exampleReader:
# print('Row #' + str(exampleReader.line_num) + ' ' + str(row))
if (row[3] in provinces.keys()):
provinces[row[3]] = provinces[row[3]] + 1
else:
provinces[row[3]] = 1
print (sorted(provinces.items(), key=lambda d: d[1], reverse=True))
什么?import io, import sys,还有下面一句是干嘛的,那你需要把这几句去掉看看发生了。没错,控制台的中文正常显示变成乱码了。
多说几句,这里dict存储的数据结构为{‘浙江省’: 3,‘河北省’: 5}这种形式,if else判断,比如有浙江省这个key了,那么就给后面的value + 1如果没有,则赋值1
最后一句话是根据dict的value倒序排列,打印的数据根据省份从大到小排序。
坑点
-
文件命名不要是csv.py,为什么呢,因为一旦你这样命名你import 的csv不是自带的包了,他会把当前文件引用进来,然后报错没有reader这个属性,所以不要以包名称直接命名文件。
-
如果不慎以csv.py命名了,你可能会发现以后import csv都会出现问题,这时候你需要去当前文件夹下找csv.py文件和一个缓存文件,即使你刚刚执行了重命名操作。
-
exampleFile = open('data.csv','r', encoding='UTF-8')
如果不加后面的 r 和 encoding ,会报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
然后你说不想用csv文件,你比较喜欢excel,那我们就来读一下excel。不要直接将csv改个后缀变成excel,即使那样生成的文件也很像一个excel,但是程序是读不出来的!这样,新建一个excel文件,然后将csv中的内容拷贝过来,粘贴到excel上就可以了。openpyxl是自带的,不需要下载
#coding=utf8
# 解析excel,本文件是用于解析微信好友列表
import openpyxl
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
wb = openpyxl.load_workbook('wechat-data.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
friendsData=[]
for row in range(3, sheet.max_row):
NickName = sheet['B' + str(row)].value #表示读取的是B单元格中的数据
Sex = sheet['C' + str(row)].value
Province = sheet['D' + str(row)].value
City = sheet['E' + str(row)].value
Signature = sheet['F' + str(row)].value
friendData = { #因为只想统计省份,所以没有添加其他属性
'nick': NickName,
'province': Province
}
friendsData.append(friendData) #先将数据拼接成一个数组,这也是同csv不同的一步
provinces = {}
for friend in friendsData:
if (friend['province'] in provinces.keys()):
provinces[friend['province']] = provinces[friend['province']] + 1
else:
provinces[friend['province']] = 1
print (sorted(provinces.items(), key=lambda d: d[1], reverse=True))
说实话,看了代码是不是发现csv文件更方便一些,没错因为csv更接近我们的文本格式。
坑点
- 虽说python不需要提前声明变量,但是当使用append方法的时候,他需要知道他是一个数组,所以要在for循环前面加上一个变量的初始化操作。
- 有时会遇到一个格式错误
IndentationError: unindent does not match any outer indentation level
,这个时候考虑代码中将报错的代码行将有多余的Tab键或者空格键,什么意思呢,也就是if或者else的下一行与前面的间隙格式要统一,是空格就都是空格,是Tab键就都是Tab键。推荐文件统一使用Tab键。 - 之前看的一本书的介绍,但是好多属性都变了大家注意下即可。比如 sheet.max_row是新属性,之前是一个方法返回的,但是现在已经不支持该方法了,会导致错误。
本文只是分析了省份数据,其他的可以自行发挥。
说到最后
渐渐发现,python这门语言可以无关项目,无关工程仅仅作为一个脚本语言,可以很大的让我们意识到编程为人们服务的特点,适合提升自己的兴趣,愿我们都能越来越好。