Python网络爬虫之数据存储

版权声明:本文为博主原创文章,有参考的地方都会在文中给出链接。如有转载,需征求博主同意。 https://blog.csdn.net/striver6/article/details/89449891

在这里插入图片描述

学习笔记

一、JSON简介

什么是json?

JSON(JavaScipt Object Notation,JS对象标记)是一种轻量级的数据交互格式。它基于ECMAScript(w3c指定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,易于人阅读和编写,同时容易于机器解析和生成,并有效地提升网络传输效率。更多解释请见百度百科:

注意:json只是一种数据格式,不是数据类型,json的数据类型是str。

二、JSON支持数据格式

  • 对象(字典)。使用花括号
  • 列表(数组)。使用方括号
  • 整型、浮点型
  • 字符串类型(字符串必须要用双引号,不能用单引号)

多个数据之间使用逗号隔开。

注意:JSON本身实质上就是一个字符串。

json格式检测和解析:
https://www.json.cn/
http://www.bejson.com/

三、字典和列表转JSON(将python对象转化为json字符串):

#设置工作目录
import os
os.chdir("G:\\python\\Python学习\\json")
import json
books = [
    {
     'title':'钢铁是怎样练成的',
     'price':98        
    },
    {
        'title':'红楼梦',
        'price':99
    }
]
json_str = json.dumps(books,ensure_ascii=False)
print(type(json_str))
print(json_str)

结果:

<class 'str'>
 [{"title": "钢铁是怎样练成的", "price": 98}, {"title": "红楼梦", "price": 99}]

然后,我们可以看到,python对象已经被转化为了json,单引号已经变成了双引号。

因为json在dumps的时候,只能存放ascii的字符,因此会将中文字符进行转译,这时候我们可以使用ensure_ascii=False关闭这个特性。

在python中,只有基础类型才能转化为json格式的字符串,也即:int、float、str、list、dict、tuple(元组)。非基本类型需要先将其转化为基本类型,才能将其转化为json格式。

存储json数据到文件中:

with open('books.json','w') as fp:
    fp.write(json_str)

四、将python数据直接dump到文件中

json模块中除了dumps函数,还有一个dump函数,这个函数可以传入一个文件指针,直接将字符串dump到文件中。

import json
books = [
    {
     'title':'钢铁是怎样练成的',
     'price':98        
    },
    {
        'title':'红楼梦',
        'price':99
    }
]
with open('a.json','w') as fp:
    json.dump(books,fp)

五、编码问题

即转化json和保存数据同步进行,打开’a.json’,发现文件中是ascii编码:

[{"title": "\u94a2\u94c1\u662f\u600e\u6837\u7ec3\u6210\u7684", "price": 98}, {"title": "\u7ea2\u697c\u68a6", "price": 99}]

可以在使用dump函数时,设置ensure_ascii参数为False:

with open('b.json','w') as fp:
    json.dump(books,fp,ensure_ascii = False)

打开’b.json’,出现了乱码(这个不知道是哪国语言):

[{"title": "ΈΦΜϊΚΗΤυΡωΑ·³Ι΅Δ", "price": 98}, {"title": "ΊμΒΓΞ", "price": 99}]

我们可以指定打开文件时文件编码为utf-8:

with open('c.json','w',encoding='utf-8') as fp:
    json.dump(books,fp,ensure_ascii = False)

打开’c.json’,很完美:

[{"title": "钢铁是怎样练成的", "price": 98}, {"title": "红楼梦", "price": 99}]

六、将json转化为python对象

将json转化为list:

json_str = '[{"title": "钢铁是怎样练成的", "price": 98}, {"title": "红楼梦", "price": 99}]'
books = json.loads(json_str,encoding='utf-8')
print(type(books))
print(books)

结果:

    <class 'list'>
    [{'title': '钢铁是怎样练成的', 'price': 98}, {'title': '红楼梦', 'price': 99}]

查看json中的元素:

for book in books:
    print(type(book))
    print(book)
{'title': '钢铁是怎样练成的', 'price': 98}
<class 'dict'>
{'title': '红楼梦', 'price': 99}
<class 'dict'>

直接从文件中读取json:

import os 
os.chdir("G:\\python\\Python学习\\json")
import json
with open('a.json','r',encoding='utf-8') as fp:
    json_str = json.load(fp)
    print(json_str)
[{'title': '钢铁是怎样练成的', 'price': 98}, {'title': '红楼梦', 'price': 99}]

七、csv文件

csv文件解释(https://zh.wikipedia.org/wiki/逗号分隔值):

术语“CSV”泛指具有以下特征的任何文件:

  • 纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312(简体中文环境)等;
  • 由记录组成(典型的是每行一条记录);
  • 每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
  • 每条记录都有同样的字段序列。

读取csv文件:

import os
os.chdir('G:\\python\\Python学习\\csv')
import csv
with open('stock.csv','r') as fp:
    # reader是一个迭代器
    reader = csv.reader(fp)
    # 表示去掉标题行
    titles= next(reader)
    for x in reader:
        print(x)

结果:


    ['0', '000001.XSHE', '1', '平安银行', 'XSHE', '2017/12/1', '13.38', '13.4', '13.48', '12.96', '13', '178493315']
    ['1', '000002.XSHE', '2', '万科A', 'XSHE', '2017/12/1', '31.22', '30.5', '32.03', '30.5', '30.73', '55743855']
    ['2', '000004.XSHE', '4', '国农科技', 'XSHE', '2017/12/1', '25.56', '25.41', '26.4', '25.18', '26.2', '2211059']
    ['3', '000005.XSHE', '5', '世纪星源', 'XSHE', '2017/12/1', '4.2', '4.2', '4.24', '4.2', '4.22', '2365348']
    ['4', '000006.XSHE', '6', '深振业A', 'XSHE', '2017/12/1', '9.85', '0', '0', '0', '9.85', '0']
    ['5', '000007.XSHE', '7', '全新好', 'XSHE', '2017/12/1', '16.66', '0', '0', '0', '16.66', '0']
    ['6', '000008.XSHE', '8', '神州高铁', 'XSHE', '2017/12/1', '8.48', '8.48', '8.74', '8.41', '8.59', '5689054']
    ['7', '000009.XSHE', '9', '中国宝安', 'XSHE', '2017/12/1', '7.6', '7.61', '7.63', '7.53', '7.58', '9149395']
    ['8', '000010.XSHE', '10', '美丽生态', 'XSHE', '2017/12/1', '5.13', '5.13', '5.23', '5.11', '5.21', '6765580']
    ['9', '000011.XSHE', '11', '深物业A', 'XSHE', '2017/12/1', '17.18', '17.08', '17.28', '17', '17.11', '2474700']
    ['10', '000012.XSHE', '12', '南玻A', 'XSHE', '2017/12/1', '9.19', '9.1', '9.28', '9.02', '9.11', '35308183']
   ......
    ['2102', '300716.XSHE', '300716', '国立科技', 'XSHE', '2017/12/1', '26.5', '25.8', '27.4', '25.8', '26.85', '5483801']
    ['2103', '300717.XSHE', '300717', '华信新材', 'XSHE', '2017/12/1', '39.48', '38.82', '39.49', '38.06', '38.65', '1969054']
    ['2104', '300718.XSHE', '300718', '长盛轴承', 'XSHE', '2017/12/1', '40.13', '40.01', '40.95', '39.5', '39.96', '3050717']
    ['2105', '300719.XSHE', '300719', '安达维尔', 'XSHE', '2017/12/1', '27.13', '27', '27.58', '26.39', '27.31', '6095688']
    ['2106', '300720.XSHE', '300720', '海川智能', 'XSHE', '2017/12/1', '33.43', '33', '33.39', '31.89', '32.81', '3307540']

这样操作,以后在获取数据的时候,就可以通过下标来获取数据:

import csv
with open('stock.csv','r') as fp:
    # reader是一个迭代器
    reader = csv.reader(fp)
    # 表示去掉标题行
    titles= next(reader)
    for x in reader:
        name = x[3]
        volumn = x[-1]
        print({"name":name,"volumn":volumn})

结果:

{'name': '平安银行', 'volumn': '178493315'}
{'name': '万科A', 'volumn': '55743855'}
{'name': '国农科技', 'volumn': '2211059'}
{'name': '世纪星源', 'volumn': '2365348'}
{'name': '深振业A', 'volumn': '0'}
{'name': '全新好', 'volumn': '0'}
{'name': '神州高铁', 'volumn': '5689054'}
{'name': '中国宝安', 'volumn': '9149395'}
{'name': '美丽生态', 'volumn': '6765580'}
{'name': '深物业A', 'volumn': '2474700'}
{'name': '南玻A', 'volumn': '35308183'}

如果想要在获取数据的时候通过标题来获取,那么可以使用DictReader。

import csv

with open('stock.csv','r') as fp:
    # 使用DictReader创建的reader对象,不会包含标题那行的数据,reader是一个迭代器,遍历这个迭代器,返回的是一个字典
    reader= csv.DictReader(fp)
    for x in reader:
        print(x['turnoverVol'])

结果:

178493315
55743855
2211059
2365348
0
0
5689054
9149395
6765580
2474700
35308183
1236110
29434715
1562976
5792996
0

八、写入数据到csv文件

写入数据到csv文件中,需要创建一个writer对象,主要用到两个方法。一个是writerow,这个是写入一行,一个是writerows,这个是写入多行:

import os 
os.chdir('G:\\python\\Python学习\\csv')

import csv

headers = ['name','age','classroom']
values = [
    ('zhilaio',18,'111'),
    ('wwj',20,'222'),
    ('sshs',21,'222')
]
# 'w'表示write,以写的方式打开文件,newline = '',encoding = 'utf-8'指定编码格式,newline = '\n',即每写入一行,会换行,这里我们改为空的字符串
with open('text.csv','w',encoding = 'utf-8', newline = '') as fp:
    writer = csv.writer(fp)
    #写入一行数据,即标题
    writer.writerow(headers)
    # 写入多行数据
    writer.writerows(values)

也可以使用字典的方式把数据写入进去,这时候就需要使用DictWriter了。

import csv

headers = ['name','age','classroom']
values = [
    {"name":'zhilaio',"age":18,"classroom":'111'},
    {"name":'abd',"age":28,"classroom":'1244'}
   ]
with open('text1.csv','w',newline = '') as fp:
    writer = csv.DictWriter(fp,headers)
    writer.writeheader()
    writer.writerow({"name":'lxp',"age":24,"classroom":'139'})
    writer.writerows(values)

End

猜你喜欢

转载自blog.csdn.net/striver6/article/details/89449891
今日推荐