In [ ]:
''' 【项目01】 商铺数据加载及存储 作业要求: 1、成功读取“商铺数据.csv”文件 2、解析数据,存成列表字典格式:[{'var1':value1,'var2':value2,'var3':values,...},...,{}] 3、数据清洗: ① comment,price两个字段清洗成数字 ② 清除字段缺失的数据 ③ commentlist拆分成三个字段,并且清洗成数字 4、结果存为.pkl文件 '''
In [10]:
# 读取数据 f = open('商铺数据.csv','r',encoding='utf8') for i in f.readlines()[:5]: print(i.split(',')[2]) #print(i.split('\n')) f.seek(0) # 光标返回第一个字符
comment 我要点评 74 条点评 265 条点评 2748 条点评
In [12]:
# 读取数据 f = open('商铺数据.csv','r',encoding='utf8') for i in f.readlines()[:5]: print(i.split(',')[4]) #print(i.split('\n')) f.seek(0) # 光标返回第一个字符
price 人均 ¥125 人均 ¥48 人均 ¥21 人均 ¥142
Out[12]:
0
In [13]:
# 读取数据 f = open('商铺数据.csv','r',encoding='utf8') for i in f.readlines()[:5]: print(i.split(',')) #print(i.split('\n')) f.seek(0) # 光标返回第一个字符
['\ufeffclassify', 'name', 'comment', 'star', 'price', 'address', 'commentlist\n'] ['美食', '望蓉城老坛酸菜鱼(合生汇店)', '我要点评', '该商户暂无星级', '人均 ¥125', '翔殷路1099号合生汇5F', '口味8.3 环境8.4 服务8.5\n'] ['美食', '泰国街边料理', '74 条点评', '准四星商户', '人均 ¥48', '黄兴路合生汇B2美食集市内', '口味7.4 环境7.6 服务7.4\n'] ['美食', '壹面如故(苏宁生活广场店)', '265 条点评', '准四星商户', '人均 ¥21', '邯郸路585号苏宁生活广场B1层', '口味7.0 环境7.2 服务7.2\n'] ['美食', '鮨谷•Aburiya(合生汇店)', '2748 条点评', '准五星商户', '人均 ¥142', '翔殷路1099号合生广场5楼23、28铺位', '口味8.9 环境8.5 服务8.4\n']
Out[13]:
0
In [11]:
# 清洗数据 def fcomment(s): # 清洗comment这一列 if '条' in s: return(int(s.split(' ')[0])) # 按照空格分割,如果包含关键词‘条’,则返回第一个字符,比如‘74’ else: return('缺失数据') f.seek(0) # 光标返回第一个字符 for i in f.readlines()[:10]: cm = fcomment(i.split(',')[2]) print(cm)
缺失数据 缺失数据 74 265 2748 5 785 3779 458 1280
In [14]:
f.seek(0) # 光标返回第一个字符 def fprice(s): # 清洗comment这一列 if '¥' in s: return(int(s.split('¥')[-1])) # 按照空格分割,如果包含关键词‘条’,则返回第一个字符,比如‘74’ else: return('缺失数据') for i in f.readlines()[:10]: cp = fprice(i.split(',')[4]) print(cp)
缺失数据 125 48 21 142 缺失数据 24 70 14 47
In [16]:
f.seek(0) for i in f.readlines()[:10]: print(i.split(',')[-1])
commentlist 口味8.3 环境8.4 服务8.5 口味7.4 环境7.6 服务7.4 口味7.0 环境7.2 服务7.2 口味8.9 环境8.5 服务8.4 口味7.5 环境6.8 服务7.5 口味7.4 环境7.2 服务7.2 口味8.6 环境8.6 服务8.6 口味7.0 环境6.5 服务6.5 口味7.7 环境7.5 服务7.6
In [17]:
f.seek(0) for i in f.readlines()[:10]: print(i.split(',')[-1].split(' '))
['commentlist\n'] ['口味8.3', '环境8.4', '服务8.5\n'] ['口味7.4', '环境7.6', '服务7.4\n'] ['口味7.0', '环境7.2', '服务7.2\n'] ['口味8.9', '环境8.5', '服务8.4\n'] ['口味7.5', '环境6.8', '服务7.5\n'] ['口味7.4', '环境7.2', '服务7.2\n'] ['口味8.6', '环境8.6', '服务8.6\n'] ['口味7.0', '环境6.5', '服务6.5\n'] ['口味7.7', '环境7.5', '服务7.6\n']
In [21]:
f.seek(0) # 光标返回第一个字符 def fcmlst(s): # 清洗commentlist这一列,即最后一列 if len(s) == 3: # 判断数据长度是否为3,来判断是否为缺失数据 quality = float(s[0][2:]) #取第一个元素,如'口味8.3',从第3个字符开始 environment = float(s[1][2:]) service = float(s[2][2:]) return([quality,environment,service]) else: return ('缺失数据') for i in f.readlines()[:10]: cl = fcmlst(i.split(',')[-1].split(' ')) print(cl)
缺失数据 [8.3, 8.4, 8.5] [7.4, 7.6, 7.4] [7.0, 7.2, 7.2] [8.9, 8.5, 8.4] [7.5, 6.8, 7.5] [7.4, 7.2, 7.2] [8.6, 8.6, 8.6] [7.0, 6.5, 6.5] [7.7, 7.5, 7.6]
In [33]:
# 数据清洗 datalist = [] f.seek(0) n = 0 #for i in f.readlines()[1:20]: #用从第1行开始读,而不是第0行,因为第0行为数据标头 for i in f.readlines()[1::]: #用从第1行开始读,而不是第0行,因为第0行为数据标头 data = i.split(',') #print(data) classify = data[0] name = data[1] commentcount = fcomment(data[2]) star = data[3] price = fprice(data[4]) address = data[5] quality = fcmlst(i.split(',')[-1].split(' '))[0] environment = fcmlst(i.split(',')[-1].split(' '))[1] service = fcmlst(i.split(',')[-1].split(' '))[2] #print(commentcount,star,price,address,quality,environment,service) if '缺失数据' not in (commentcount,star,price,address,quality,environment,service): n += 1 data_lst2 = [['classification',classify], ['name',name], ['comment_count',commentcount], ['star',star], ['price',price], ['address',address], ['quality',quality], ['environment',environment], ['service',service]] #print(data_lst2) datalist.append(dict(data_lst2)) #print('成功读取第%i条数据: '%n) print(dict(data_lst2)) else: continue f.close() print(datalist) print('成功加载%i条数据: '%n)
{'classification': '美食', 'name': '泰国街边料理', 'comment_count': 74, 'star': '准四星商户', 'price': 48, 'address': '黄兴路合生汇B2美食集市内', 'quality': 7.4, 'environment': 7.6, 'service': 7.4} {'classification': '美食', 'name': '壹面如故(苏宁生活广场店)', 'comment_count': 265, 'star': '准四星商户', 'price': 21, 'address': '邯郸路585号苏宁生活广场B1层', 'quality': 7.0, 'environment': 7.2, 'service': 7.2} {'classification': '美食', 'name': '鮨谷•Aburiya(合生汇店)', 'comment_count': 2748, 'star': '准五星商户', 'price': 142, 'address': '翔殷路1099号合生广场5楼23、28铺位', 'quality': 8.9, 'environment': 8.5, 'service': 8.4} {'classification': '美食', 'name': '麦当劳(万达店)', 'comment_count': 785, 'star': '准四星商户', 'price': 24, 'address': '邯郸路600号万达商业广场B1楼A05号铺', 'quality': 7.4, 'environment': 7.2, 'service': 7.2} {'classification': '美食', 'name': '蒸年青STEAMYOUNG(百联又一城购物中心店)', 'comment_count': 3779, 'star': '准五星商户', 'price': 70, 'address': '淞沪路8号百联又一城购物中心7层', 'quality': 8.6, 'environment': 8.6, 'service': 8.6} {'classification': '美食', 'name': '丸来玩趣(百联又一城购物中心店)', 'comment_count': 458, 'star': '准四星商户', 'price': 14, 'address': '淞沪路8号百联又一城购物中心B1层', 'quality': 7.0, 'environment': 6.5, 'service': 6.5} {'classification': '美食', 'name': '韩国雪冰(合生汇店)', 'comment_count': 1280, 'star': '四星商户', 'price': 47, 'address': '翔殷路1099号合生汇4F', 'quality': 7.7, 'environment': 7.5, 'service': 7.6} {'classification': '美食', 'name': '小菜园新徽菜(五角场万达广场店)', 'comment_count': 85, 'star': '准五星商户', 'price': 81, 'address': '邯郸路600号万达商业广场特力时尚汇3层', 'quality': 8.5, 'environment': 8.9, 'service': 9.0} {'classification': '美食', 'name': '阿满鸡排(合生汇店)', 'comment_count': 30, 'star': '四星商户', 'price': 17, 'address': '翔殷路1099号合生汇4层', 'quality': 7.9, 'environment': 8.0, 'service': 7.7} ...... 成功加载560条数据:
In [42]:
import pickle pic = open('商铺数据.csv','wb') pickle.dump(datalist,pic) pic.close() print('complete')
complete