Python 模块之 CSV 读取

news2025/7/13 13:33:55

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

1.4 避免读取第一行表头

import csv

l = []

FileObj = open('t.csv')
readerObj = csv.reader(FileObj)

for row in readerObj:
    if readerObj.line_num == 1:		# readerObj.line_num 会返回 csv 文件的行数
        continue
    l.append(row)

print(l)
FileObj.close()
[['1', 'rose', '18'], ['2', 'lila', '19']]

1.5 按字典格式读取

import csv

# 编码问题,请添加 encoding = 'utf-8'。pandas 库可以调用 DataFrame 对象的 to_csv() 方法写入 csv 中
with open('C:\\Users\\hj\\Desktop\\data2.csv', 'w') as f:
    
    # writer = csv.writer(f)
    # writer.writerow(['id', 'name', 'age'])
    # writer.writerow([1, 'rose', 18])
    # writer.writerow([2, 'tom', 19])

    # 存储字典
	fieldnames = {'id', 'name', 'age'}
    
    writer = csv.DictWriter(f, fieldnames=d)
    writer.writeheader()
    writer.writerow({'id': 1, 'name': 'rose', 'age':18})
    writer.writerow({'id': 2, 'name': 'lina', 'age':19})
    writer.writerow({'id': 3, 'name': 'john', 'age':20})

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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python安装好了某个包但是仍报错ImportError: No module named xxx的解决方法及思路

这是一个应该比较常见的问题&#xff0c;下面首先讲一下该类问题的一般解决 思路&#xff0c;然后再进行一个自我debug的过程描述。 1 解决思路 出现该问题的根本原因是&#xff0c;当前使用的python环境&#xff0c;和已经安装了包的python环境不是同一个。解决问题一般可以根…

数组、指针总结【面试题】

文章目录0. 补充知识数组笔试题1. 一维数组1.1 字符数组1.1.1 sizeof1.1.2 strlen1.2 二维数组2. 指针笔试题0. 补充知识 在进入数组与指针的练习时&#xff0c;我们先来复习以下以下的知识点&#xff0c;这可以帮助我们更好的理解下面练习 数组是一组能存放相同类型的类型的元…

数据库的查询

数据库的查询 一、知识要点&#xff1a; 1.SELECT语句的一般格式 SELECT [ ALL|DISTINCT ] [TOP N [PERCENT] ] <目标列表达式> [别名] [&#xff0c;<目标列表达式> [别名] ]… FROM <表名或视图名> [ 别名 ][&#xff0c;<表名或视图名> [ 别名 ] ]…

JavaScript DOM API的使用

文章目录一. 什么是DOM二. 最常用的DOM API1. 选中页面元素2. 操作元素的属性2.1 事件概念2.2 获取/修改元素内容计数器2.4 获取/修改元素属性点击图片切换2.5 获取/修改表单元素属性表单计数器全选/取消全选按钮2.6 获取修改样式属性点击文字放大实现夜间/日间模式的切换3. 操…

【C++】反向迭代器

文章目录一、什么是反向迭代器二、STL 源码中反向迭代器的实现三、reverse_iterator 的模拟实现四、vector 和 list 反向迭代器的实现一、什么是反向迭代器 C 中一共有四种迭代器 – iterator、const_iterator、reverse_iterator 以及 const_reverse_iterator&#xff0c;其中…

基层治理四平台解决方案

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 省基层治理体系“四个平台”采用“1N"统分结合的建设模式:即统筹建设“1"个浙江政务服务网基层业务协同平台(以下简称“协同平台”)&#xff0c;同步改造、整合、推广“N…

【java】Collection源码阅读(JDK 8)

package java.util;import java.util.function.Predicate; import java.util.stream.Stream; import java.util.stream.StreamSupport;/*** 集合层次结构的根接口&#xff0c;一个集合表示一组对象&#xff0c;称为元素* JDK不提供任何该接口的直接实现&#xff0c;JDK提供实现…

Elasticsearch 核心技术(六):内置的 8 种分词器详解 + 代码示例

❤️ 博客主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录一、内置分词器1. Standard&#xff08;标准分词器&#xff09;英文示例中文示例…

八.异常控制流ECF

1.异常异常位于硬件和OS的交界部分系统调用是为应用程序提供到OS的入口点的异常进程和信号位于应用和OS的交界部分非本地跳转是ECF的应用层形式1.1 异常表异常是控制流中的突变&#xff0c;用来响应处理器状态的某些变化状态变化称为事件系统中可能的每种类型的异常都分配了一个…

虹科教您 | 在Windows环境下安装PCAN View及通讯测试指南

应用简介 PCAN-View软件是一款简化的CAN监视软件&#xff0c;可用于显示、发送、和记录CAN数据通讯。报文可手动和定期发送&#xff0c;用户可设置比特率。在处理期间显示总线系统错误和CAN硬件的存储器过满。示踪功能可用于记录和保存CAN数据通讯。本文档的作用在于&#xff…

软件测试的几个关键步骤,你需要知道

记得2年前刚毕业的时候听说了软件测试这个行业&#xff0c;当时也去百度仔细进行了一番搜索&#xff0c;评价基本千篇一律的看好。 看好的原因在于&#xff0c;专家认为未来的互联网市场用户体验至上&#xff0c;而产品质量与用户体验有紧密的联系&#xff0c;自从近年产品经理…

eyoucms field 获取channelartlist标签的字段值

【基础用法】 标签&#xff1a;field 描述&#xff1a;获取channelartlist标签里的字段值&#xff0c;field标签只能在channelartlist标签里使用。 用法&#xff1a; {eyou:channelartlist typeid栏目ID typeson row20} <a href{eyou:field nametypeurl /}>{eyou:fi…

SCCM 应用程序管理

Microsoft System Center Configuration Manager &#xff08;SCCM&#xff09; 被认为是管理 Microsoft 应用程序的示例性工具。它可以无缝地进行补丁管理和软件部署。但处理第三方应用程序不是它的游戏。因此&#xff0c;除了补丁管理之外&#xff0c;Patch Connect Plus 还为…

接口里面可以写实现方法吗【可以】 、接口可以多继承吗【可以】

比如下面这道题&#xff1a; 问: 接口里面可以写方法吗&#xff1f; 答: 当然可以啊&#xff0c;默认就是抽象方法。 . 问&#xff1a; 那接口里面可以写实现方法吗&#xff1f; 答&#xff1a; 不可以&#xff0c;所有方法必须是抽象的。 . 问&#xff1a; 你确定吗&#xff1…

Java面试题--SpringRefresh流程

Spring refresh 概述 Spring 容器是一个管理 bean 的容器&#xff0c;可以创建、注入和管理 bean 及其依赖关系。Spring 容器可以根据应用程序配置和运行时条件创建、初始化和销毁 bean。refresh() 函数是 Spring 容器中的一种功能&#xff0c;可以重新加载和刷新容器中的配置…

什么?同步代码块失效了?-- 自定义类加载器引起的问题

一、背景 最近编码过程中遇到了一个非常奇怪的问题&#xff0c;基于单例对象的同步代码块似乎失效了&#xff0c;百思不得其姐。 下面给出模拟过程和最终的结论。 二、场景描述和模拟 2.1 现象描述 Database实现单例&#xff0c;在 init 方法中使用同步代码块来保证 data不…

Revit中图纸要怎么布局呢?

1、明确图纸布局原则。 2、在图纸上锁定视图的位置 在图纸上放置视图(或明细表)并根据需要对其定位后&#xff0c;可以将其锁定到位&#xff0c;这样就不会在无意中移动它。如果想要解锁视图&#xff0c;单击锁定图标即可&#xff0c;如图1所示。 3、在图纸上旋转视图 可以在图…

imx6 usb增强信号强度

USB信号 参考&#xff1a;官方文档 USB信号完整性取决于许多因素&#xff0c;如电路设计、PCB布局、堆叠和阻抗。每个产品可能彼此不同&#xff0c;因此客户需要微调参数&#xff0c;以获得最佳的信号质量。 测试板已经路由出两个USB端口:一个OTG1&#xff0c;一个主机。每个端…

xcode14安装swift package设置github账户token

这里写目录标题登录github账户,复制token打开xcode添加github账户选择swift package登录github账户,复制token 登录github点击上面菜单自己的头像,settings->Developer settings->Personal access tokens->Tokens (classic)->Generate new token (classic) Note名…

Spring 响应式编程-读书笔记

序言 大家好&#xff0c;我是比特桃。本文为《Spring 响应式编程》的读书笔记&#xff0c;响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点&#xff0c;同时响应式可以容忍网络延迟&#xff0c;并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速…