写入和读取CSV、Excel和Word中的数据是编写爬虫程序的重要内容,现将学习爬虫涉及到的文档数据存储知识整理出来与大家分享。
常用的数据存储介质有文件、关系型数据库和非关系型数据库。文本文档存储适用于具有时效性的数据,如股市行情、商品信息和排行榜信息等,这类数据具有动态变化性质,非特殊要求下,建议存放文件。Python标准库自带CSV模块,不用自行安装。
代码如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 创建时间 :1/18/22 7:08 PM # 文件 :CSV数据的写入和读取.py # IDE :PyCharm import csv # 若存在文件,则打开csv文件,若不存在,则新建文件 # 若不设置newline='',则每行数据会隔一行空白行 csvfile = open('csv_test.csv', 'w', newline='') # 将文件加载到csv对象中 writer = csv.writer(csvfile) # 写入一行数据 writer.writerow(['姓名', '年龄', '电话']) # 多行数据写入 data = [ ('小P', '18', '13134343222'), ('小Y', '22', '138001380000') ] writer.writerows(data) # 关闭csv对象 csvfile.close()
writerow和writerows对应单行写入和多行写入
代码如下:
# 获取全部数据 #_*_coding:utf-8_*_ # 作者 :liuxiaowei # 创建时间 :1/18/22 7:19 PM # 文件 :读取csv.py # IDE :PyCharm import csv csvfile = open('csv_test.csv', 'r') # 以列表形式输出 reader = csv.reader(csvfile) # 以字典形式输出,第一行作为字典的键 # reader = csv.DictReader(csvfile) rows = [row for row in reader] print(rows)
可以循环全部数据,再对每行数据做一个判断,判断是否符合筛选条件,代码如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 创建时间 :1/18/22 7:26 PM # 文件 :读取某一行数据.py # IDE :PyCharm import csv csvfile = open('csv_test.csv', 'r') reader = csv.reader(csvfile) # 获取某一行数据 for row in reader: if '小Y' in row: print(row)
小结:CSV的存储相对简单而且实用性比较强
Python操作的Excel库有xldd、xlwt、pyExcelerator 和openpyxl。其中,pyExcelerator只支持2003版本,openpyxl只支持2007版本,xlrd支持Excel任何版本的读取,xlwt支持Excel任何版本的写入。
# xlrd和xlwt的安装 pip install xlrd pip install xlwt
相对比CVS复杂,Excel可以实现设置数据格式、合并单元格、设置公式和插入图片等功能。使用xlwt实现上述功能,代码如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 创建时间 :1/18/22 7:32 PM # 文件 :xlwt-写数据.py # IDE :PyCharm import xlwt # 新建一个Excel 文件 wb = xlwt.Workbook() # 新建一个sheet ws = wb.add_sheet('Python', cell_overwrite_ok=True) # 定义字体对齐方式对象 alignment = xlwt.Alignment() # 设置水平方向 # HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED # HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED alignment.horz = xlwt.Alignment.HORZ_CENTER # 设置垂直方向 # VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED alignment.vert = xlwt.Alignment.VERT_CENTER # 定义格式对象 style = xlwt.XFStyle() style.alignment = alignment # 合并单元格write_merge(开始行, 结束行, 开始列, 结束列, 内容, 格式) ws.write_merge(0, 0, 0, 5, 'Python网络爬虫',style) # 写入数据wb.write(行,列,内容) for i in range(2, 7): for k in range(5): ws.write(i, k, i + k) # Excel 公式xlwt.Formula ws.write(i, 5, xlwt.Formula('SUM(A'+str(i+1)+':E'+str(i+1)+')')) # 插入图片,insert_bitmap(img, x ,y , x1, y1, scale_x=0.8, scale_y = 1) # 图片格式必须bmp # x表示行数,y表示烈属 # x1表示相对原来位置向下偏移的像素 # y1表示相对原来位置向右偏移的像素 # scale_x, scale_y缩放比例 ws.insert_bitmap('/Users/liuxiaowei/PycharmProjects/爬虫练习/文档数据存储/Excel数据/test.bmp', 9, 1, 2, 2,scale_x=0.3, scale_y=0.3) # 保存文件 wb.save('file.xls')
如下:
(1)xlwt创建生成临时Excel对象
(2)添加WorkSheets对象
(3)单元格的位置由行列索引决定,索引从0开始
(4)数据写入主要由write_merge()和write()实现,两者分别是合并单元格再写入和单元格写入。
(5)设置数据格式是在写入(write_merge()和write())的数据中传入参数style
由xlrd模块实现,以上述代码生成的Excel文件为读取目标,代码如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 创建时间 :1/18/22 10:30 PM # 文件 :xlrd-读取数据.py # IDE :PyCharm # xlrd:excel read import xlrd wb = xlrd.open_workbook('file.xls') # 获取Sheets总数 ws_count = wb.nsheets print('Sheets总数: ', ws_count) # 通过索引顺序获取Sheets # ws = wb.sheets()[0] # ws = wb.sheet_by_index(0) # 通过Sheets名获取Sheets ws = wb.sheet_by_name('Python') # 获取整行的值(以列表返回内容) row_value = ws.row_values(3) print('第4行数据: ', row_value) # 获取整列的值(以列表返回内容) row_col = ws.col_values(3) print('D列数据:', row_col) # 获得所有行列 nrows = ws.nrows ncols = ws.ncols print('总行数: ', nrows, ', 总列数:', ncols) # 获取某个单元格内容cell(行,列) cell_F3 = ws.cell(2, 5).value print('F3内容:', cell_F3) # 使用行列索引获取某个单元格内容 row_F3 = ws.row(2)[5].value col_F3 = ws.col(5)[2].value print('F3内容: ', row_F3, 'F3内容:', col_F3)
如下:
(1)xlrd 生成Workbook对象,并指向Excel文件
(2)选择Workbook里某个WorkSheets对象
(3)获取WorkSheets里数据已占用的总行数和总列数(某个单元格数据)
(4)循环总行数和总列数,读取每一个单元格数据
注意:当我们使用xlrd模块读取Excel的时候,如果Excel的数据内容中添加了图片信息,那么xlrd模块将无法读取Excel的数据内容
将数据存储在Word文档中,一般以文章、新闻报道和小说这类文字内容较长的数据为主。Python读写Word需要第三方库扩展支持,使用pip安装:
pip install python-docx
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 创建时间 :1/18/22 11:18 PM # 文件 :写入数据.py # IDE :PyCharm # 数据写入 from docx import Document from docx.shared import Inches # 创建对象 document = Document() # 添加标题,其中"0"代表标题类型,共有4种类型,具体可在Word的"开始--样式"中查看document.add_heading('Python 爬虫', 0) # 添加正文内容并设置部分内容格式 p = document.add_paragraph('Python 爬虫开发-') # 设置内容加粗 p.runs[0].bold = True # 添加内容并加粗 p.add_run('数据存储-').bold = True # 添加内容 p.add_run('Word-') # 添加内容并设置字体斜体 p.add_run('存储实例。').italic = True # 添加正文,设置'样式'--'明显引用' document.add_paragraph('样式-明显引用', style='IntenseQuote') # 添加正文、设置"项目符号" document.add_paragraph( '项目符号2', style='ListNumber' ) # 添加图片 document.add_picture('test.png', width=Inches(1.25)) # 添加表格 table = document.add_table(rows=1,cols=3) hdr_cells = table.rows[0].cells hdr_cells[0].text = 'Qty' hdr_cells[1].text = 'Id' hdr_cells[2].text = 'Desc' for item in range(2): row_cells = table.add_row().cells row_cells[0].text = 'a' row_cells[1].text = 'b' row_cells[2].text = 'c' # 保存文件 document.add_page_break() document.save('test.docx')
如下:
(1)创建生成临时Word对象
(2)分别使用add_paragraph()和add_heading()对Word对象添加标题和正文内容
(3)如果想设置正文内容的字体加粗和斜体等,可以将正文内容p对象的属性runs[0].bold和add_run(‘XX’).italic设置为True
(4) 如果要插入图片和添加表格,可以在Word对象中使用方法add_picture()和add_table()
(5) 完成数据写入, 需要将Word对象保存生成Word文件
代码如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 创建时间 :1/18/22 11:43 PM # 文件 :读取数据.py # IDE :PyCharm # 数据读取 import docx def readDocx(docName): fullText = [] doc = docx.Document(docName) # 读取全部内容 paras = doc.paragraphs # 将每行数据存入列表 for p in paras: fullText.append(p.text) # 将列表数据转成字符串 return '\n'.join(fullText) print(readDocx('test.docx'))
如下:
(1)生成Word对象,并指向Word文件
(2)使用paragraphs()获取Word对象全部内容
(3)循环paragraphs对象,获取每行数据并写入列表
(4)将列表转成字符串,每个列表元素使用换行符连接,转换后数据的段落布局与Word文档相似
希望此文对您有所帮助和启发。欢迎关注,点赞和转发。