文章目录
所总结的方法基于个人使用过的方法,各库的读写还有其他方法,依各人使用情况和习惯选择
1 CSV数据读写
1.1 介绍
- 逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录。
- 可用python库:pandas,numpy,csv。(本人常结合使用前两种库和处理Excel数据的库)
CSV | Excel |
---|---|
纯文本格式,用逗号分隔一系列值 | 二进制文件 |
只是一个文本文件,用于存储数据,但不包含格式,公式,宏等。也被称为平面文件 | 可以存储数据,可以对数据进行操作 |
.csv | .xls或.xlsx |
可以用Windows中的任何文本编辑器打开,如记事本,vscode等 | 只能用Microsoft Excel文档打开,不能被文本编辑器打开或编辑 |
任何编程语言来解析CSV数据非常容易 | 用于解析Excel数据的编程语言库通常会更大,更慢,更复杂 |
1.2 pandas
1.2.1 安装
pip install pandas
# 非终端
!pip install pandas
1.2.2 读取
import pandas as pd
df = pd.read_csv(fileName)
# 按行读取(数据部分的i行至j-1行数据)
lines = df.iloc[i:j]
# 按列读取
# 1、读取列索引字段为"title"的数据
col = df["title"].tolist()
# 2、加载文件时直接获取某列或某些列
file = pd.read_csv(filename, usecols=["col1Name", "col2Name"])
# 获取某一值,以下两种都可(读取title列的第i+1个数据)
val = df["tilte"][i]
val = df["title"].tolist()[i]
1.2.3 写入
# 字典格式
data = {
"name": ["Jason", "Molly", "Tina", "Jake", "Amy"],
"age": [31, 23, 19, 28, 18],
"score": [98, 76, 84, 79, 92]
}
# (colums参数默认值为dic的key)
df = pd.DataFrame(data, columns = ["name", "age", "score"], index = ["n1","n2","n3","n4","n5"])
# 列表格式
list = [["Jason", "Molly", "Tina", "Jake", "Amy"],
[15, 19, 10, 24, 21],
[78, 84, 71, 89, 93]
]
df = pd.DataFrame(dic, columns = ["name", "age", "score"], index = ["n1","n2","n3","n4","n5"])
1.2.4 保存
df.to_csv(filename)
# 转置后保存
df.T.to_csv(filename)
注意
- 使用字典数据时,
columns
列索引默认为字典的键key,可以指定其他列索引值,若无对应的数据,则写入时该列的值为Nan
值- 写入不需要行索引时,在
df.to_csv()
中添加参数index = False
列表
数据按行
写入,字典
数据按列
写入,若各组数据数量不同,字典数据格式无法写入,列表数据格式仍按行写入,且从左往右
写入,空值在右侧,需判断是否需要转置"df.T
"保存,Excel中有16384列x1048576行
,使用转置并使用Excel打开时,需要注意行列数,以防丢失数据- 读取文件时报错
'utf-8' codec can't decode byte 0xb1 in position 0: invalid start byte
,记事本打开,另存为utf-8
格式文件,或用其他正确的编码格式打开文件
1.3 numpy
1.3.1 介绍
- 用Python进行科学计算的基础软件包
- 一个运算速度非常快的一个数学库
- 进行向量和矩阵计算
1.3.2 读取写入
- 因为是处理数组矩阵,所以读写较为便捷
import numpy as np
data = [[1,2,3,4],[4,5,6,7]]
# 写入
np.savetxt(filename, data, delimiter = ",")
# 读取
data = np.loadtxt(filename, delimiter = ",")
# (按字符串读取)
data = np.loadtxt(filename, str, delimiter = ",")
# 其他功能(读取时跳过第一行数据)
data = np.loadtxt(filename, delimiter = ",", skiprows = 1)
注意
- 写入时只能为float格式数据,读取时可以按字符串格式读取,然后再按需求转换数据格式
- 若列表嵌套内各列表元素数量不同,需要先用数值补齐(比如用
float("inf")
),或用pandas处理数据
1.4 csv
import csv
data = [[1,2,3],[4,5,6]]
# 写入
with open(filename,"a", newline = "") as csvfile:
cw = csv.writer(csvfile, delimiter = ",")
for row in data:
cw.writerow(row)
# 读取
with open(filename, "r", newline = "") as csvfile:
rows = csv.reader(csvfile, delimiter=",")
for row in rows:
print(row)
# print(",".join(row))
注意
- 读取为字符串格式
2 Excel数据读写
2.1 写入
import openpyxl
# 写入的数据
data = [[1,2,3],[4,5,6],[7,8,9]]
# 创建工作表
wb = openpyxl.Workbook()
# 获取激活的工作簿
ws = wb.active
# 循环写入(先循环行后循环列)
for i,d in enumerate(data):
for j,dd in enumerate(d):
ws.cell(row = i+1, column = j+1).value = dd
# 颜色填充
from openpyxl.styles import PatternFill
fill = PatternFill('solid', fgColor='FFBB00')
Ws.cell(row = 1, column = 1).fill = fill
# 保存
wb.save(filename)
2.2 读取
# 获取工作表
wb = load_workbook(filename)
# 获取所有工作簿名称
sheets = wb.sheetnames
# 获取第一个名称对应的工作簿
ws = wb[sheets[0]]
# 获取单元格的值
d = ws.cell(row = 1, column = 1).value
注意
- 读写Excel数据时,以行列循环嵌套为主,读写逻辑十分简单,但
for
循环嵌套的代码逻辑要清晰- 读写csv数据时,以整行整列或整体数据为主,读写逻辑相比Excel数据读写稍微复杂一点但也容易,代码语句也简单易读易写
- 参考链接
Excel和CSV格式文件的不同之处