Python爬虫笔记——存储数据的基础知识(Csv、Excel)

Python爬虫笔记——存储数据的基础知识(Csv、Excel)_第1张图片
存储成csv格式文件和存储成Excel文件,这两种不同的存储方式需要引用的模块也是不同的。操作csv文件我们需要借助csv模块;操作Excel文件则需要借助openpyxl模块。

一、CSV

import csv
#引用csv模块。
csv_file = open('demo.csv','w',newline='',encoding='utf-8')
#创建csv文件,我们要先调用open()函数,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8'。

我们得创建一个新的csv文件,命名为“demo.csv”。
“w”就是writer,即文件写入模式,它会以覆盖原内容的形式写入新添加的内容。
加newline=’ '参数的原因是,可以避免csv文件出现两倍的行距(就是能避免表格的行与行之间出现空白行)。
加encoding=‘utf-8’,可以避免编码问题导致的报错或乱码。
CSV写入:

import csv
#引用csv模块。
csv_file = open('demo.csv','w',newline='',encoding='utf-8')
#调用open()函数打开csv文件,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8'。
writer = csv.writer(csv_file)
# 用csv.writer()函数创建一个writer对象。
writer.writerow(['电影','豆瓣评分'])
#调用writer对象的writerow()方法,可以在csv文件里写入一行文字 “电影”和“豆瓣评分”。
writer.writerow(['银河护卫队','8.0'])
#在csv文件里写入一行文字 “银河护卫队”和“8.0”。
writer.writerow(['复仇者联盟','8.1'])
#在csv文件里写入一行文字 “复仇者联盟”和“8.1”。
csv_file.close()
#写入完成后,关闭文件就大功告成啦!

【提醒】:writerow()函数里,需要放入列表参数,所以我们得把要写入的内容写成列表。就像[‘电影’,‘豆瓣评分’]。

CSV读取:

import csv
csv_file = open('demo.csv','r',newline='',encoding='utf-8')
reader = csv.reader(csv_file)
for row in reader:
    print(row)

第1、2行代码:导入csv模块。用open()打开“demo.csv”文件,‘r’是reader读取模式,newline=’'是避免出现两倍行距。encoding='utf-8’能避免编码问题导致的报错或乱码。
第3行代码:用csv.reader()函数创建一个reader对象。
第4、5行代码:用for循环遍历reader对象的每一行。打印row,就能读取出“demo.csv”文件里的内容。

二、Excel(openpyxl)

一个Excel文档也称为一个工作薄(workbook),每个工作薄里可以有多个工作表(wordsheet),当前打开的工作表又叫活动表。
每个工作表里有行和列,特定的行与列相交的方格称为单元格(cell)。比如上图第A列和第1行相交的方格我们可以直接表示为A1单元格。
安装方法:window电脑:在终端输入命令:pip install openpyxl,按下enter键。

import openpyxl 
#写入的代码:
wb = openpyxl.Workbook()  #利用openpyxl.Workbook()函数创建新的workbook(工作薄)对象,就是创建新的空的Excel文件。
sheet = wb.active   #wb.active就是获取这个工作薄的活动表,通常就是第一个工作表。
sheet.title = 'new title'   #可以用.title给工作表重命名。现在第一个工作表的名称就会由原来默认的“sheet1”改为"new title"。
sheet['A1'] = '漫威宇宙'   #把'漫威宇宙'赋值给第一个工作表的A1单元格,就是往A1的单元格中写入了'漫威宇宙'。
rows = [['美国队长','钢铁侠','蜘蛛侠','雷神'],['是','漫威','宇宙', '经典','人物']]   #先把要写入的多行内容写成列表,再放进大列表里,赋值给rows。
for i in rows:  #遍历rows,同时把遍历的内容添加到表格里,这样就实现了多行写入。
    sheet.append(i)
print(rows)
wb.save('Marvel.xlsx')   #保存新建的Excel文件,并命名为“Marvel.xlsx”

#读取的代码:
wb = openpyxl.load_workbook('Marvel.xlsx')   #调用openpyxl.load_workbook()函数,打开“Marvel.xlsx”文件。
sheet = wb['new title']   #获取“Marvel.xlsx”工作薄中名为“new title”的工作表。
sheetname = wb.sheetnames   #sheetnames是用来获取工作薄所有工作表的名字的。如果你不知道工作薄到底有几个工作表,就可以把工作表的名字都打印出来。
print(sheetname)   
A1_cell = sheet['A1']
A1_value = A1_cell.value
print(A1_value)   #把“new title”工作表中A1单元格赋值给A1_cell,再利用单元格value属性,就能打印出A1单元格的值

总结

import requests,openpyxl
wb=openpyxl.Workbook()  
#创建工作薄
sheet=wb.active 
#获取工作薄的活动表
sheet.title='Jay_song' 
#工作表重命名

sheet['A1'] ='歌曲名'     #加表头,给A1单元格赋值
sheet['B1'] ='所属专辑'   #加表头,给B1单元格赋值
sheet['C1'] ='播放时长'   #加表头,给C1单元格赋值
sheet['D1'] ='播放链接'   #加表头,给D1单元格赋值

url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
for x in range(2):
    params = {
        'ct': '24',
        'qqmusic_ver': '1298',
        'new_json': '1',
        'remoteplace': 'sizer.yqq.song_next',
        'searchid': '64405487069162918',
        't': '0',
        'aggr': '1',
        'cr': '1',
        'catZhida': '1',
        'lossless': '0',
        'flag_qc': '0',
        'p': str(x + 1),
        'n': '20',
        'w': '周杰伦',
        'g_tk': '5381',
        'loginUin': '0',
        'hostUin': '0',
        'format': 'json',
        'inCharset': 'utf8',
        'outCharset': 'utf-8',
        'notice': '0',
        'platform': 'yqq.json',
        'needNewCode': '0'
    }

    res_music = requests.get(url, params=params)
    json_music = res_music.json()
    list_music = json_music['data']['song']['list']
    for music in list_music:
        name = music['name']
        # 以name为键,查找歌曲名,把歌曲名赋值给name
        album = music['album']['name']
        # 查找专辑名,把专辑名赋给album
        time = music['interval']
        # 查找播放时长,把时长赋值给time
        link = 'https://y.qq.com/n/yqq/song/' + str(music['file']['media_mid']) + '.html\n'
        # 查找播放链接,把链接赋值给link
        sheet.append([name, album, time,url])
        # 把name、album、time和link写成列表,用append函数多行写入Excel
        print('歌曲名:' + name + '\n' + '所属专辑:' + album +'\n' + '播放时长:' + str(time) + '\n' + '播放链接:'+ url)
        
wb.save('Jay.xlsx')            
#最后保存并命名这个Excel文件,保存在编译文件所在目录位置
print('文件已完成')

三、Excel(xlrd和xlwt)

3.1 xlrd和xlwt的安装
xlrd和xlwt是python的第三方库,所以是需要自己安装的,可以在python的官网https://pypi.python.org/pypi下载该模块来安装,也可以通过其他手段,比如easy_install或者pip,我在Win7环境下已经安装好pip,所以就在命令符窗口中用如下命令来安装xlrd和xlwt。
pip install xlrd
pip install xlwt

3.2 xlrd使用介绍
1、导入模块
import xlrd
2、打开Excel文件读取数据
data = xlrd.open_workbook(‘excelFile.xls’)
3、使用技巧
获取一个工作表
table = data.sheets()[0] #通过索引顺序获取
table = data.sheet_by_index(0) #通过索引顺序获取
table = data.sheet_by_name(u’Sheet1’) #通过名称获取

    获取整行和整列的值(数组)  
    table.row_values(i)
    table.col_values(i)

    获取行数和列数  
    nrows = table.nrows 
    ncols = table.ncols
   
    循环行列表数据
    for i in range(nrows):
           print table.row_values(i)

    单元格
    cell_A1 = table.cell(0,0).value
    cell_C4 = table.cell(2,3).value

    使用行列索引
    cell_A1 = table.row(0)[0].value
    cell_A2 = table.col(1)[0].value

    简单的写入
    row = 0
    col = 0

    # 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    ctype = 1 value = '单元格的值'
    xf = 0 # 扩展的格式化
    table.put_cell(row, col, ctype, value, xf)
    table.cell(0,0)  #单元格的值'
    table.cell(0,0).value #单元格的值'

eg:

import os
import xlrd
from datetime import date,datetime
 
#打开Excel文件
workbook = xlrd.open_workbook('09-10.11-38-12-HTTP-GOOD-1-Lte1sDataStat_Charts.xlsx')
 
#输出Excel文件中所有sheet的名字
print workbook.sheet_names()
 
#根据sheet索引或者名称获取sheet内容
Data_sheet    = workbook.sheets()[0]
CdfData_sheet = workbook.sheet_by_index(1)
Charts_sheet  = workbook.sheet_by_name(u'Charts')
 
#获取sheet名称、行数和列数
print Data_sheet.name,    Data_sheet.nrows,    Data_sheet.ncols,\
	  CdfData_sheet.name, CdfData_sheet.nrows, CdfData_sheet.ncols,\
	  Charts_sheet.name,  Charts_sheet.nrows,  Charts_sheet.ncols
 
#获取整行和整列的值(列表)	  
rows = Data_sheet.row_values(0) #获取第一行内容
cols = Data_sheet.col_values(1) #获取第二列内容
#print rows
#print cols
 
#获取单元格内容
cell_A1 = Data_sheet.cell(0,0).value
cell_C1 = Data_sheet.cell(0,2).value
cell_B1 = Data_sheet.row(0)[1].value
cell_D2 = Data_sheet.col(3)[1].value
print cell_A1, cell_B1, cell_C1, cell_D2
 
#获取单元格内容的数据类型
#ctype:0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
print 'cell(0,0)数据类型:', Data_sheet.cell(0,0).ctype
print 'cell(1,0)数据类型:', Data_sheet.cell(1,0).ctype
print 'cell(1,1)数据类型:', Data_sheet.cell(1,1).ctype
print 'cell(1,2)数据类型:', Data_sheet.cell(1,2).ctype
 
#获取单元格内容为日期的数据
date_value = xlrd.xldate_as_tuple(Data_sheet.cell_value(1,0),workbook.datemode)
print date_value
print '%d:%d:%d' %(date_value[3:])
 
d = {'11:25:59':[1, 2, 3], '11:26:00':[2, 3, 4], '11:26:01':[3, 4, 5]}
print d['11:25:59']
print d['11:26:00']
print d['11:26:01']
 
print d['11:25:59'][0]
print d['11:26:00'][0]
print d['11:26:01'][0]

3.3 相关模块
相关模块:
csv python标准模块。推荐。
xlrd 读取 .xls, .xlsx 文件。
xlutils xlrd和xlwt的集合。
openpyxl 读写 Excel 2007 xlsx/xlsm文件 。纯python,效率不高。
Matplotlib 2D作图模块,适用于基于excel作图。
Pywin32 python windows扩展 ,不跨平台,通过COM口连接excel。
Pyxll 在excel中使用python替代vbs。http://www.pyxll.com/。类似模块有pyinex。Python For Excel http://www.opentradingsystem.com/PythonForExcel/main.html
XlsxWriter 写xlsx文件。纯python。

3.4 快速入门
下面例子,创建一个名为mini.xls的文件,它有一个空sheet:‘xlwt was here’。代码见mini.py。
fromxlwt import *
w =Workbook()
ws = w.add_sheet(‘xlwtwas here’)
w.save(‘mini.xls’)

Workbook类初始化时有encoding和style_compression参数。

encoding,设置字符编码,一般要这样设置:w = Workbook(encoding=‘utf-8’),就可以在excel中输出中文了。默认是ascii。当然要记得在文件头部添加:

-- coding: utf-8--

style_compression 表示是否压缩,不常用。
Workbook 还有一些属性:
Owner 设置文档所有者。
country_code: 国家码
wnd_protect: 窗口保护
obj_protect: 对象保护
Protect: 保护
backup_on_save: 保存时备份
Hpos: 横坐标
Vpos: 纵坐标
Width: 宽度
Height: 高度
active_sheet: 活动sheet
tab_width: tab宽度
wnd_visible: 窗口是否可见
wnd_mini: 窗口最小化
hscroll_visible: 横向滚动条是否可见。
vscroll_visible: 纵向滚动条是否可见。
tabs_visible: tab是否可见。
dates_1904: 是否使用1904日期系统
use_cell_values: 单元格的值
default_style: 默认样式
colour_RGB: 颜色

方法有:add_style,add_font,add_str,del_str,str_index,add_rt,rt_index,add_sheet,get_sheet,raise_bad_sheetname,convert_sheetindex,setup_xcall,add_sheet_reference。

eg:

import os
import xlwt			
 
 
def set_style(name, height, bold = False):
	style = xlwt.XFStyle()   #初始化样式
	
	font = xlwt.Font()       #为样式创建字体
	font.name = name
	font.bold = bold
	font.color_index = 4
	font.height = height
	
	style.font = font
	return style
 
	
def write_excel():
	#创建工作簿
	workbook = xlwt.Workbook(encoding='utf-8')  
	#创建sheet
	data_sheet = workbook.add_sheet('demo')  
	row0 = [u'字段名称', u'大致时段', 'CRNTI', 'CELL-ID']
	row1 = [u'测试', '15:50:33-15:52:14', 22706, 4190202]
	
	#生成第一行和第二行
	for i in range(len(row0)):
		data_sheet.write(0, i, row0[i], set_style('Times New Roman', 220, True))
		data_sheet.write(1, i, row1[i], set_style('Times New Roman', 220, True))
	
	#保存文件
	workbook.save('demo.xls')	
	
	
if __name__ == '__main__': 
	write_excel()
	print u'创建demo.xlsx文件成功'

你可能感兴趣的:(爬虫笔记,Python程序设计小技巧,python)