【python爬虫 系列】6.本地数据存储

第六节:本地数据存储
日常操作文件许多时候,并不是操作有难题,而是路径问题_
6.0. os模块
日常操作文件许多时候,并不是操作有难题,而是路径问题,
而处理路径问题,就可以利用os模块
下面的代码会自行判断你文件夹是否存在,如果不存在会自己创建

import os

filename = "test"

if not os.path.exists(filename):   #判断文件夹是否存在
	os.mkdir(filename)             #如果不存在则创建

在这里插入图片描述

在这里我么创建了一个test的文件夹

print(os.getcwd())
print(os.path.join(os.getcwd(),"test"))  #即使不加\也会自动替换

输出:

D:\科技\python\爬虫\大师
D:\科技\python\爬虫\大师\test
#写入方法:
import os

filename = "test"

if not os.path.exists(filename):   #判断文件夹是否存在
	os.mkdir(filename)             #如果不存在则创建


filename = os.getcwd()   #获取当前目录
#print(filename)
txt = "test"

with open (os.path.join(filename,txt),"w") as f:  #利用join方法混入test
	f.write("test web")

简化方法起文件名:当需要大批量下载图片或者文档的时候,可以使用UUID

import uuid
from uuid import UUID 

#基于时间戳
print(uuid.uuid1())
#基于名字的MD5散列
print(uuid.uuid3(UUID(int=1),"no"))
#基于随机数 推荐
print(uuid.uuid4())
#基于名字的SHA-1散列
print(uuid.uuid5(UUID(int=3),"zss"))

输出:

cf59c5b4-5843-11ea-9270-e86a64061ace
ced504fe-c732-3784-85e8-e4ef35e0834b
0a2f143c-af28-423b-98c8-82243d3b6be7
c442e430-9405-5bd2-aaf2-c880d2ae2655

6.1.python操作文本
r- 读取文件
w- 创建文件,多次会覆盖源文件
a- 追加文件,不存在会创建
b- 操作二进制流(图片音乐视频 wb)
± rw的集合
一般的文本文件存储,我们只需要存储在txt里边就可以了,如下:

with open("test.txt","w",encoding="utf-8") as f:
	f.write("test web \ntest web")

文件又开启也有关闭,之所以利用with表达式,就是因为免去了close,防止内存溢出造成的错误
读取文件也很简单,如下:

with open("test.txt","r",encoding="utf-8") as f:
	result=f.read()
	print(result)

输出:

test web 
test web

或者是一行一行读取,如下:

with open("test.txt","r",encoding="utf-8") as f:
	result=f.readlines()
	print(result)

输出:['test web \n', 'test web']
扩展知识:

  1. readline()
with open("test.txt","r",encoding="utf-8") as f:
		result=f.readline()
		print(result)

输出:仅仅输出一行

test web
  1. 日常我们处理应尽量利用redlines()
    方便我们对txt文件逐行操作,存入列表,迭代处理
    如下:w
ith open("test.txt","r",encoding="utf-8") as f:
	result=f.readlines()
	for r in result:
		print(r.strip()) #去除空格

输出:

test web
test web

存储图片视频音乐这些二进制流也很简单,
就像我们前面所讲到的百度图片爬取一样

#图片视频
def download(url):
	img = requests.get(url,headers=headers)
	with open("imgs/{}.jpg".format(uuid.uuid4()),"wb") as f:
		chunks = img.iter_content(125)
		for c in chunks:
			f.write(c)

值得一提的是chunks = img.iter_content(125)
利用了二进制流小块处理的方法
避免一次性占满内存,减轻CPU压力,在读取大文件时候很有优势

6.2.Python操作csv
我们日常存储txt没问题,但是工作上多以csv,excel,word的形式交接数据
学名:逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

Csv是逗号分隔符,一般是以下形式:
Symbol,Price,Date,Time,Change,Volume
“AA”,39.48,“6/11/2007”,“9:36am”,-0.18,181800
“AIG”,71.38,“6/11/2007”,“9:36am”,-0.15,195500
“AXP”,62.58,“6/11/2007”,“9:36am”,-0.46,935000
“BA”,98.31,“6/11/2007”,“9:36am”,+0.12,104800
“C”,53.08,“6/11/2007”,“9:36am”,-0.25,360900
“CAT”,78.29,“6/11/2007”,“9:36am”,-0.23,225400
1) 读取
不同于TXT,使用专门的reader()缓冲区
Next()取出第一行标题,之后迭代内容

import csv

def get_csv():
	with open("test.csv",encoding="utf-8") as f:
		f_csv = csv.reader(f)
		header =next(f_csv)
		for row in f_csv:
			print(row)
if __name__ == '__main__':
	get_csv()

输出:

['lilei', '12']
['hanmeimei', '100']

2) 写入
写入csv,需要注意将f初始化进入writer,获得句柄
写入的数据是列表嵌套元组,Writerow写入一行,Writerows写入多行

读取csv使用csv模块,写入csv按照如下格式即可:

headers=["12522SS,715282,4FB55FE8"]
rows = [("a",1,300),("b",2,420)]

with open("test1.csv","w") as f:
	f_csv = csv.writer(f)
	f_csv.writerow(headers)
	f_csv.writerows(rows)

封装函数写法:

def wrirte_csv(data):
	with open("存储文件名.csv","a") as f:
		f_csv = csv.writer(f)
		f_csv.writerow(data)

def crawl():
	html = request.get("url")
	soup = html.text
	for i in soup:
		wrirte_csv(i)

Csv写入字典(扩展用,尽量不适用)
一般来说,字典因为哈希的存在是无序的
不过python实现了有序字典
From collections import OrderedDict得到有序字典对象
OrderedDict([‘Symbol’, ‘AA’), ]
普及知识:为什么字典无序( 3.6版本之前无序)
哈希表的算法是获取键,对键执行一个叫做哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中存储你的值。任何一个值的地址皆取决与它的键。

正因为这种随意性,哈希表中的值是没有顺序的
你拥有一个无序的数据集。

6.3.处理json文件
JSON(]avaScript Object Notation)是一种轻量级的数据交换格式 ,JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

Json模块提供了简单的编解码json格式的方法
主要是json.dumps()和json.loads()接口很少
而json.dump()和json.load()适用于写入文件的时候
如果想把我们的python数据结构转化为json,需要这样写:

import json


data = {
	"name":"hanmeimei",
	"score":99
}

res = json.dumps(data)
print(res)

输出:

{"name": "hanmeimei", "score": 99}	

当然你也可以写入文件:

with open("data.json","w") as f:
		json.dump(data,f)

把json字符串解析为我们的python结构也很容易。

import json
data = '{"name":"hanmeimei","score":"100"}'
res = json.loads(data)
print(res)

输出:

{'name': 'hanmeimei', 'score': '100'}

如果大家操作的json不是直接的字符串,而是存储在了文本里,需要这样写:

with open("data.json","r") as f:
	print(json.load(f))

输出:

{'name': 'hanmeimei', 'score': 99}

注意:6.4,6.5仅做了解,并不常用,
感兴趣可以学习利用python实现办公自动化的操作
6.4.Python操作Excel
(尽量适用csv)
安装模块pip install lxrd lxwt

说明:
Lxwt用于创建和写入XIrd用于读取数据
一个w,一个r
如果要获取某个指定单元格的数据,需要使用
sheet.cell value( l,i)

6.5.Python写入word(基本不用):
安装模块:pip install python-docx
不过大多是是用来读取word文件的。
感兴趣的读者可以关注我的博客专栏,里面是一些办公自动化的操作
https://blog.csdn.net/ai_linnglong/category_9718088.html

发布了31 篇原创文章 · 获赞 29 · 访问量 2452

猜你喜欢

转载自blog.csdn.net/AI_LINNGLONG/article/details/104515712