文档章节

csv、json 文件读取

o
 osc_g8254g7s
发布于 2019/08/19 22:35
字数 834
阅读 13
收藏 0

精选30+云产品,助力企业轻松上云!>>>

1、CSV 文件存储

1.1 写入

简单示例

import csv

with open('data.csv', 'a') as csvfile:
    writer = csv.writer(csvfile)       # 初始化写入对象,传入文件句柄
    writer.writerow(['id', 'name', 'age'])      # 调用 writerow() 方法传入每行的数据
    writer.writerow(['1', 'rose', '18'])
    writer.writerow(['2', 'john', '19'])

以文本方式打开,分隔符默认为逗号(,):

id,name,age

1,rose,18

2,john,19

修改默认分隔符:

writer = csv.writer(csvfile, delimiter=' ')   	# 以空格为分隔符

同时写入多行:

# 此时参数为二维列表
writer.writerow([['1', 'rose', '18'], ['2', 'john', '19']])

避免出现空行,可以在写入时加 newline=''

with open("test.csv", "a+", newline='') as csvfile:

如果数据源是字典

import csv

with open('data1.csv', 'a') as csvfile:
    fieldnames = ['id', 'name', 'age']      # 定义表头
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)         # 初始化一个字典,将文件句柄和表头传入
    writer.writeheader()        # 写入表头
    writer.writerow({'id': '1', 'name': 'rose', 'age': 18})     # 写入表格中具体内容

编码问题,需要指定 open() 函数编码格式:

open('data.csv', 'a', encoding='utf-8')

另外 pandas 库的 DataFrame 对象的 to_csv() 方法也可以将数据写入 csv 中。

1.2 读取

import csv

with open('data1.csv', 'r') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

结果如下:

['id', 'name', 'age']
['1', 'rose', '18']

Tips:如果有中文需要指定文件编码


pandas 库的 read_csv() 方法

import pandas as pd

df = pd.read_csv('data.csv')
print(df)

运行结果如下:

   id  name  age
0   1  rose   18
1   2  john   19

1.3 避免重复插入表头

#newline的作用是防止每次插入都有空行    
with open("test.csv", "a+", newline='') as csvfile:		# 必须使用 a+,追加方式
        writer = csv.writer(csvfile)
        #以读的方式打开csv 用csv.reader方式判断是否存在标题。
        with open("test.csv", "r", newline="") as f:
            reader = csv.reader(f)
            if not [row for row in reader]:
                writer.writerow(["型号", "分类"])
                writer.writerows([[keyword, miaoshu]])
            else:
                writer.writerows([[keyword, miaoshu]])

示例

爬取一下该网站的所有评论:https://www.bestbuy.ca/en-ca/product/hp-hp-officejet-pro-6968-all-in-one-inkjet-printer-with-fax-6968/10441056/review

import requests
import time
import csv

headers = {
        "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) "
                      "Version/11.0 Mobile/15A372 Safari/604.1",
        "Referer": "https://www.bestbuy.ca/en-ca/product/hp-hp-officejet-pro-6968-all-in-one-inkjet-printer-with-fax-"
                   "6968/10441056/review"
    }


def get_content(url):
    """爬取数据"""
    res = requests.get(url=url, headers=headers)
    # print(res.status_code)
    return res.json()


def parse_res(res):
    """解析数据"""
    csv_data = {}
    # print(res, type(res))
    data = res["reviews"]
    for i in data:
        csv_data["title"] = i["title"]
        csv_data["comment"] = i["comment"]
        csv_data["publish"] = i["reviewerName"]
        csv_data["publish_time"] = i["submissionTime"]
        print(csv_data)
        save_data(csv_data)


def save_data(csv_data):
    """存储数据"""
    with open('data.csv', 'a+', newline='') as csvfile:
        # 以读的方式打开 csv,判断表格是否有数据
        with open('data.csv', 'r', newline='') as f:
            reader = csv.reader(f)
            fieldnames = ['title', 'comment', 'publish', 'publish_time']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)		# DictWriter: 字典
            if not [row for row in reader]:
                writer.writeheader()
                writer.writerow(csv_data)
            else:
                writer.writerow(csv_data)

if __name__ == '__main__':
    for i in range(1, 11):
        url = 'https://www.bestbuy.ca/api/v2/json/reviews/10441056?source=all&lang=en-CA&pageSize=10&page=%s' \
              '&sortBy=date&sortDir=desc' % i
        res = get_content(url)
        time.sleep(2)
        parse_res(res)

参考文章:https://blog.csdn.net/qq_41817302/article/details/88680886

2. JSON 文件存储

2.1 读取 JSON

import json

s = '''
    [{
        "name": "rose",
        "gender": "female",
        "age": "18"
    }]
'''

data = json.loads(s)
print(data)
print(type(data))

运行结果如下:

[{'name': 'rose', 'gender': 'female', 'age': '18'}]
<class 'list'>			# 因为最外层是列表

读取 JSON 文件

with open('data.json', 'r') as f:
    s = f.read()
    data = json.loads(s)
    print(data)

2.2 输出 JSON

import json

data = [{
        "name": "rose",
        "gender": "female",
        "age": "18"
    }]


with open('data.json', 'a') as f:
    f.write(json.dumps(data))

缩进 2 个字符,这样结构更清晰:

with open('data.json', 'a') as f:
    f.write(json.dumps(data, indent=2))

运行结果如下:

[
  {
    "name": "rose",
    "gender": "female",
    "age": "18"
  }
]

如果输出的包含中文,须臾指定参数 ensure_ascii=False,否则默认转换为 Unicode 字符:

with open('data.json', 'a') as f:
    f.write(json.dumps(data, indent=2, ensure_ascii=False))

上一篇: Django Model
下一篇: Python 列表切片
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Python中csv xml json之间相互转换最简单的方法分享

Python优越的灵活性和易用性使其成为最受欢迎的编程语言之一,尤其是对数据科学家而言。 这在很大程度上是因为使用Python处理大型数据集是很简单的一件事情。 如今,每家科技公司都在制定数据...

osc_kzwkjl9k
2019/07/05
8
0
在python中使用CSV、JSON、XML

目录 CSV 读CSV 写CSV 用pandas库来读写CSV JSON 读写JSON(与字典配合使用) 格式转换 XML

奔跑的Yancy
03/31
0
0
seldom之数据驱动

seldom之数据驱动 如果自动化某个功能,测试数据不一样而操作步骤是一样的,那么就可以使用参数化来节省测试代码。 seldom是我在维护一个Web UI自动化测试框,这里跟大家分享seldom参数化的实...

osc_o60il3e6
04/16
2
0
spark文件读取与保存(scala实现)

文本文件 将一个文本文件读取为RDD时,输入的每一行都会成为RDD的一个元素。也可以将多个完整的文本文件一次性读取为一个pairRDD, 其中键是文件名,值是文件内容。 // 读取文本文件 val inpu...

osc_kbyywydz
2019/01/17
4
0
seldom之数据驱动

seldom之数据驱动 如果自动化某个功能,测试数据不一样而操作步骤是一样的,那么就可以使用参数化来节省测试代码。 seldom是我在维护一个Web UI自动化测试框,这里跟大家分享seldom参数化的实...

虫师
03/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

会议通知 | 2020中国计算与认知神经科学会议

关于大会关于 计算神经科学以神经生物实验为基础,以建立数学模型,开展计算模拟和分析作为基本手段,来刻画和描述大脑的神经活动,探究神经系统各种复杂活动和认知功能包括注意、学习、记忆...

脑机接口社区
06/02
20
0
大神分享快3怎么算下期和值

大神分享快3怎么算下期和值{叩67790572}使用的标签:constructor-arg标签出现的位置:bean标签的内部标签中的属性type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个...

yiren081
28分钟前
21
0
Matlab系列之运算符和标点符号的功能介绍

本来月初就打算接着写的,但是电脑不小心进水,主板什么的都废了,周末才找时间拿去修好,心塞。 就不多讲太多废话了,开始分享今天的内容,对MATLAB的运算符做个介绍,然后再对标点符号进行...

狂人V
07/06
18
0
Java源码系列(1):Comparable和Comparator的区别

在讲Comparable和Comparator区别之前,先补充一个知识点。 先看代码: Person类 1public class Person<T> { 2  private T id; 3 4  public T getId() { 5    return i...

学习Java的小姐姐
2018/09/19
25
0
ThreadPoolTaskScheduler手写调度中心

先贴一个自己写的demo把,原理其实就是这样的。 CronTrigger这个类可以将cron表达式转换成Date,可以查看schedule源码学到不少东西,下面代码就是转换成下一执行时间。 public Date nextEx...

朝如青丝暮成雪
49分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部