CSV 文件存储

  CSV,全称为 Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每条记录由若干字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比 Excel 文件更加简洁,XLS 文本是电子表格,包含文本、数值、公式和格式等内容,而 CSV 中不包含这些内容,就是特定字符分隔的纯文本,结构简单清晰。所以,有时候用 CSV 来保存数据是比较方便的。本节时 Python 读取和写入 CSV 文件的过程。

写入

例子:

import csv

with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])

  打开 data.csv 文件,然后指定打开的模式为 w(即写入),获得文件句柄,随后调用 csv 库的 writer 方法初始化写入对象,传入该句柄,然后调用 writerow 方法传入每行的数据即可完成写入。

  运行结束后,会生成一个名为 data.csv 的文件,此时数据就成功写入了。直接以文本形式打开的话,其内容如下:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

  写入的文本默认以逗号分隔,调用一次 writerow 方法即可写入一行数据。用 Excel 打开的结果如图所示。

  如果想修改列与列之间的分隔符,可以传入 delimiter 参数,其代码如下:

import csv

with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile, delimiter=' ')
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])

这里在初始化写入对象时传入 delimiter 为空格,此时输出结果的每一列就是以空格分隔了,内容如下:

id name age

10001 Mike 20

10002 Bob 22

10003 Jordan 21

  也可以调用 writerows 方法同时写入多行,此时参数就需要为二维列表,例如:

import csv

with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['id', 'name', 'age'])
writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

输出效果是相同,内容如下:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

  但是一般情况下,爬虫爬取的都是结构化数据,一般会用字典来表示。在 csv 库中也提供了字典的写入方式,示例如下:

import csv

with open('data.csv', 'w') as csvfile:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})

  先定义 3 个字段,用 fieldnames 表示,然后将其传给 DictWriter 来初始化一个字典写入对象,接着可以调用 writeheader 方法先写入头信息,然后再调用 writerow 方法传入相应字典即可。最终写入的结果是完全相同的,内容如下:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

  这样就可以完成字典到 CSV 文件的写入了。

  如果想追加写入的话,可以修改文件的打开模式,即将 open 函数的第二个参数改成 a,代码如下:

import csv  

with open('data.csv', 'a') as csvfile:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writerow({'id': '10004', 'name': 'Durant', 'age': 22})

  在上面的基础上再执行这段代码,文件内容便会变成:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

10004,Durant,22
  数据被追加写入到文件中。

  如果要写入中文内容的话,可能会遇到字符编码的问题,此时需要给 open 参数指定编码格式。例如,这里再写入一行包含中文的数据,代码需要改写如下:

import csv

with open('data.csv', 'a', encoding='utf-8') as csvfile:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writerow({'id': '10004', 'name': '李四', 'age': 22})

  需要给 open 函数指定编码,否则可能发生编码错误。

  如果接触过 pandas 等库的话,可以调用 DataFrame 对象的 to_csv 方法来将数据写入 CSV 文件中。

  安装pandas库,安装命令:

pip3 install pandas

  安装完之后,便可以使用pandas库将数据保存为CSV文件:

import pandas as pd

data = [
{'id': '10001', 'name': 'Mike', 'age': 20},
{'id': '10002', 'name': 'Fsdf', 'age': 22},
{'id': '10003', 'name': 'Sdfs', 'age': 23}
] df = pd.DataFrame(data)
df.to_csv('data.csv', index=False)

  定义几条数据,每条数据都是一个字典,然后将其组成一个列表,赋值为data。紧接着使用pandas的DataFrame类新建了一个DataFrame对象,参数传入data,并把该对象赋值为df。最后调用df的to_csv方法也可以将数据保存为CSV对象。

读取

  可以使用 csv 库来读取 CSV 文件。例如,将刚才写入的文件内容读取出来,相关代码如下:

import csv

with open('data.csv', 'r', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)

运行结果:

['id', 'name', 'age']
['10001', 'Mike', '20']
['10002', 'Bob', '22']
['10003', 'Jordan', '21']
['10004', 'Durant', '22']
['10005', ' 李四 ', '22']

  这里构造的是 Reader 对象,通过遍历输出了每行的内容,每一行都是一个列表形式。注意,如果 CSV 文件中包含中文的话,还需要指定文件编码。

  也可以使用pandas 的 read_csv 方法将数据从 CSV 中读取出来,例如:

import pandas as pd

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

运行结果:

      id  name  age
0 10001 Mike 20
1 10002 Fsdf 22
2 10003 Sdfs 23

  这里的df实际上是一个DataFrame对象,如果对此比较熟悉,可以直接使用它完成一些数据的分析处理。

  如果只想读取文件里面的数据,可以吧df再进一步转换为列表或元组:

import pandas as pd

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

  这里调用了df的values属性,再调用tolist方法,即可将数据转化为列表形式,运行结果:

[[10001, 'Mike', 20], [10002, 'Fsdf', 22], [10003, 'Sdfs', 23]]

  若直接对df进行遍历,同样能得到列表类型的结果:

import pandas as pd

df = pd.read_csv('data.csv')
for index, row in df.iterrows():
print(row.tolist())

运行结果:

[10001, 'Mike', 20]
[10002, 'Fsdf', 22]
[10003, 'Sdfs', 23]

CSV文件存储的更多相关文章

  1. Python3编写网络爬虫10-数据存储方式三-CSV文件存储

    3.CSV文件存储 CSV 全称 Comma-Separated Values 中文叫做逗号分隔值或者字符分隔值,文件以纯文本形式存储表格数据.文件是一个字符序列 可以由任意数目的记录组成相当于一个结 ...

  2. json和csv文件存储

    一. json 1:基本概念 1.1 Json和Javascript JSON, 全称JavaScript Object Notation,它通过对象和数组的组合来表示数据.在JavaScript中一 ...

  3. 爬虫存储介质之CSV文件存储

    本文章来自度娘 CSV文件存储 CSV,全称为Comma-Separated Values,中文可以叫做逗号分隔值或字符分隔值,其文件以纯文本形式 存储表格数据.该文件是一个字符序列,可以由任意数目的 ...

  4. 使用 CSV 文件存储

    将爬取到的数据以 CSV 文件形式存储: import csv import requests req = requests.get("http://www.baidu.com/" ...

  5. Go Web:数据存储(2)——CSV文件

    存储到CSV文件中 1.内存存储 2.CSV文件存储 3.gob序列化存储 本文接上一篇:内存存储. 关于CSV文件的说明,见csv文件格式 当数据存储到了内存中,可以在需要的时候持久化保存到磁盘文件 ...

  6. 爬虫文件存储:txt文档,json文件,csv文件

    5.1 文件存储 文件存储形式可以是多种多样的,比如可以保存成 TXT 纯文本形式,也可以保存为 Json 格式.CSV 格式等,本节我们来了解下文本文件的存储方式. 5.1.1 TXT文本存储 将数 ...

  7. Python常用的数据文件存储的4种格式(txt/json/csv/excel)及操作Excel相关的第三方库(xlrd/xlwt/pandas/openpyxl)(2021最新版)

    序言:保存数据的方式各种各样,最简单的方式是直接保存为文本文件,如TXT.JSON.CSV等,除此之外Excel也是现在比较流行的存储格式,通过这篇文章你也将掌握通过一些第三方库(xlrd/xlwt/ ...

  8. 【BOOK】数据存储—文件存储(TXT、JSON、CSV)

    数据存储 文本文件-TXT.JSON.CSV 关系型数据库-MySQL.SQLite.Oracle.SQL Server.DB2 非关系型数据库-MongoDB.Redis   文件打开 open() ...

  9. 技巧-如何通过hive开发平台上传csv文件

    通过数据交换平台上传较大的文件时,经常会出现导入失败情况,换种方式通过新数据开发平台(stark)也可以轻松实现外部数据与hive的数据关联. --第一步.导入csv文件到hive --stark数据 ...

  10. Selenium+java - 使用csv文件做数据驱动

    前言 早期我们使用TestNG 来做数据驱动进行测试,测试数据是写在测试用例脚本中.这会使得测试脚本的维护工作量很大.因此我们可以将测试的数据和脚本分开. 而我们经常使用会使用csv文件来做为导出数据 ...

随机推荐

  1. [GPT] vue 的 quasar 框架 在 layout 模版中 如何获取 子页面当前使用的 useMeta

      在 Quasar 框架中,用 Vue Router 的 meta 字段来获取子页面当前使用的 useMeta . 首先,您需要在路由配置中设置子页面的 meta 字段.例如: const rout ...

  2. netcore依赖注入通过反射简化

    aspnetcore里面用到许多的service,好多业务代码都要通过Service.AddScoped.Singleton.Transient等注入进去,类太多了写起来和管理起来都很麻烦,所以借鉴了 ...

  3. SQL Server实战三:数据库表完整性约束及索引、视图的创建、编辑与删除

      本文介绍基于Microsoft SQL Server软件,实现数据库表完整性约束.索引与视图的创建.编辑与删除等操作的方法. 目录 1 交互式为数据库表S创建PRIMARY KEY约束 2 交互式 ...

  4. windows版 navicat_15.0.18 安装

    视频安装地址: https://www.ghpym.com/ghvideo07.html 一.下载安装包 下载地址(百度网盘): 链接:https://pan.baidu.com/s/1MIZfmS5 ...

  5. VueJS和Javascript实现文字上下滚动效果

    一提到文字上下滚动,我们就会想到用不同的程序去实现,而且页面中有文字滚动会增加这个网页的互动和可信度. 1.Js最简单的方法是控制盒子的高度,使不断的重复添加 <html> <bod ...

  6. jeecg-boot中导出excel冲突问题

    jeecg-boot自带的库是autopoi,如果自定义导出excel引入poi,则需要POI版本要保持一致,否则会出现冲突的情况,导致这2个都用不了的情况. Autopoi底层用的是POI库,poi ...

  7. Flutter 多线程实现

    异步Isolate实现多线程   最近在看Flutter开发相关知识点,对照着Android原生,探究了下多线程实现方式.在Flutter中有 Isolate,隔离,它的实现原理并不是内存共享的,它更 ...

  8. C语言:头文件ctype.h的内置函数

    #include <stdio.h> #include <ctype.h>//内置函数的头文件 #include <math.h> int main() { int ...

  9. 阿里DataX极简教程

    目录 简介 工作流程 核心架构 核心模块介绍 DataX调度流程 支持的数据 实践 下载 环境 执行流程 引用 简介 DataX是一个数据同步工具,可以将数据从一个地方读取出来并以极快的速度写入另外一 ...

  10. linux下RPM工具的使用:RPM安装/查询/查看/卸载/升级软件包

    目录 一.关于软件包 二.RPM软件包 三.RPM包通用的命名规则 四.RPM工具的使用 4.1 rpm安装软件的功能 4.2 rpm查询的功能 4.3 rpm查看软件包内容是否被修改 4.4 rpm ...