第六节:本地数据存储
日常操作文件许多时候,并不是操作有难题,而是路径问题_
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']
扩展知识:
- readline()
with open("test.txt","r",encoding="utf-8") as f:
result=f.readline()
print(result)
输出:仅仅输出一行
test web
- 日常我们处理应尽量利用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