📒 读取数据
本节介绍使用Recorder从文件读取数据。
xlsx、csv、txt、jsonl 文件均是行结构,可用rows()方法获取遍历行,从中筛选获取需要的数据。
其中 xlsx 和 csv 还可根据表头或列序号在行数据中按列获取数据。
读取 json 文件时,需要文件是list或{'键': [数据]}结构,可把列表视作多行读取。
xlsx 文件和{'键': [数据]}结构的 json 文件可用set.table()设置要读取的数据表或数据块。
✅️ rows()方法
Recorder对象的rows()方法用于从文件读取指定数据。可根据条件获取多行。
xlsx 文件可用set.table()指定读取某个数据表,json 文件用其设置读取指定数据块。
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
cols | strintlistTrue | True | 作为关键字的列,可以是多列,传入str代表表头值,传入int代表列序号,为True获取所有列 |
sign_col | strintTrue | True | 用于筛选数据的列,传入str代表表头值,传入int代表列序号,为True获取所有行 |
signs | Any | None | 按这个值筛选目标行,可用列表设置多个 |
deny_sign | bool | False | 是否反向匹配sign,即筛选sign_col列的值不是sign指定值的行 |
count | int | None | 获取多少条数据,为None获取所有 |
begin_row | intNone | None | 数据开始的行,None表示header_row后面一行 |
end_row | intNone | None | 数据结束的行,None表示最后一行 |
| 返回类型 | 说明 |
|---|---|
List[RowData] | xlsx 和 csv 格式文件返回RowData对象组成的列表 |
List[RowText] | txt 格式文件返回RowText对象组成的列表 |
List[RowDict, RowList] | json 和 jsonl 格式文件返回RowDict及RowList对象组成的列表(取决于该行类型) |
txt 格式文件只有begin_row和end_row参数有效。
简单示例:
打印文件内所有数据。注意是从第二行开始,因为默认第一行是表头。
from DrissionRecord import Recorder
r = Recorder('data.xlsx')
r.set.table('abc') # 指定数据表,如不指定默认读取活动数据表
for row in r.rows():
print(row)
✅️ 行数据对象
rows()方法返回的结果中,每行数据为一个数据对象。
- xlsx 和 csv 文件为
RowData对象 - txt 文件为
RowText对象 - json 和 jsonl 文件为
RowDict或RowList对象
RowDict是一个dict,增加了row属性表示行号,且可用序号切片读取数据,序号从1开始。
RowList是一个list,只比普通list多了row属性。
RowText对象是一个str,只比普通str多了row属性。
📌 RowData
RowData对象是 xlsx 和 csv 文件产生的行数据,本身是一个dict。
键为表头值或列序号(表头值为空的列)。还增加了行和列有关的属性和方法。
💡 row
此属性返回某条数据的行号。
💡 header
此属性返回数据使用的表头对象。
💡 coord()
此方法返回数据中指定列的坐标。
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
key_or_num | strint | 必填 | 某列,为int时表示列序号,为str时表示表头值 |
col_num | bool | False | 列以列号还是列序号形式返回 |
| 返回格式 | 说明 |
|---|---|
(int, str) | col_num为False时返回格式为(1, 'A') |
(int, int) | col_num为True时返回格式为(1, 1) |
💡 col()
此方法返回数据中指定列的列号或列序号。
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
key_or_num | strint | 必填 | 某列,为int时表示列序号,为str时表示表头值 |
as_num | bool | True | 以列号还是列序号形式返回 |
| 返回类型 | 说明 |
|---|---|
| str | as_num为False时返回格式为'A' |
| int | as_num为True时返回格式为1 |
如果要根据列号指定列,可用Col()方法把列号转换为int再传入。
from DrissionRecord import Recorder, Col
r = Recorder('data.xlsx')
for row in r.rows():
print(row.row) # 打印行号
print(row.coord('姓名')) # 打印(1, 'B')
print(row.coord(2)) # 与上一行一样,用列序号定位
print(row.coord(Col('B'))) # 与上一行一样,用列号定位
💡 获取行中的数据
有如下表格文件:
| 序号 | 姓名 | 性别 | 年龄 |
|---|---|---|---|
| 1 | 张三 | 男 | 20 |
| 2 | 李四 | 女 | 21 |
- 指定表头值:可用
row['姓名']获取每行'姓名'列数据 - 指定列序号:可用
row[2]获取每行第二列数据 - 指定列号:可用
row[Col('B')]获取每行第二列数据
📌 RowDict
RowDict是 json 和 jsonl 文件中dict类型行返回的数据,本身是一个dict。
用切片方式获取数据时,键为str时与普通dict一致,键为int时获取指定序号数据,序号从 1 开始。
from DrissionRecord import Recorder
r = Recorder('data.json')
for row in r.rows():
print(row['abc']) # 用键获取数据
print(row[1]) # 用序号获取数据
📌 RowList
如果 json 和 jsonl 文件中的行是list,则返回RowList对象。
RowList是一个list,只比普通list多了row属性。
from DrissionRecord import Recorder
r = Recorder('data.json')
for row in r.rows():
print(row[1]) # 用序号获取数据
📌 RowTxt
txt 文件返回的数据对象是RowText,是一个str,只比普通str多了row属性。
from DrissionRecord import Recorder
r = Recorder('data.json')
for row in r.rows():
print(row, row.row) # 打印数据和行号
✅️ 筛选数据
除了获取整行数据,还可以用rows()方法的参数指定要获取的范围。
有如下表格文件data.csv:
| 姓名 | 性别 | 班级 | 状态 |
|---|---|---|---|
| 刘一 | 男 | 一班 | |
| 陈二 | 女 | 二班 | ok |
| 张三 | 男 | 一班 | |
| 李四 | 女 | 一班 | ok |
| 王五 | 男 | 二班 | ok |
| 赵六 | 女 | 二班 |
📌 按条件筛选行
假设要获取“状态”列为'ok'的行,可设置sign_col参数为'状态',signs参数为'ok'。
signs参数可用列表传入多个。当传入的是str,表示表头值,当传入的是int,表示列序号,从 1 开始。列序号可以是负数,表示从后面向前数。
如果要筛选非指定内容的行,设置deny_sign为True即可。
from DrissionRecord import Recorder
r = Recorder('data.csv')
for row in r.rows(sign_col='状态', signs='ok'):
print(row)
输出:
{'姓名': '陈二', '性别': '女', '班级': '二班', '状态': 'ok'}
{'姓名': '李四', '性别': '女', '班级': '一班', '状态': 'ok'}
{'姓名': '王五', '性别': '男', '班级': '二班', '状态': 'ok'}
📌 筛选指定列
如果不需要整行所有数据,可用cols参数指定要获取的列。
比如,在上一个示例基础上,只需要'姓名'和'班级'字段:
from DrissionRecord import Recorder
r = Recorder('data.csv')
for row in r.rows(sign_col='状态', signs='ok', cols=('姓名', '班级')):
print(row)
输出:
{'姓名': '陈二', '班级': '二班'}
{'姓名': '李四', '班级': '一班'}
{'姓名': '王五', '班级': '二班'}
📌 指定获取范围
可用begin_row、end_row在指定行号中获取数据,用count指定获取数据上限。
假设在上一个示例基础上,设置只在 4 至 7 行范围内筛选(表头占一行),且只要 1 条数据:
from DrissionRecord import Recorder
r = Recorder('data.csv')
for row in r.rows(sign_col='状态', signs='ok', cols=('姓名', '班级'),
begin_row=4, end_row=7, count=1):
print(row)
输出:
{'姓名': '李四', '班级': '一班'}
如不进行指定,默认数据从表头行的下一行开始。
可用set.header_row()设置第几行为表头行。
✅️ 更多示例
📌 json 文件示例
示例一:list结构 json 文件
[
["a", "b", "c"],
["d", "e", "f"],
["g", "h", "i"],
["j", "k", "l"]
]
from DrissionRecord import Recorder
r = Recorder('data.json')
for row in r.rows():
print(r) # 打印每行数据
print(row[0]) # 打印每行第一个数据
示例二:{'键': [数据]}结构 json 文件
{
"人员": [
{"姓名": "张三", "性别": "女"},
{"姓名": "李四", "性别": "男"},
{"姓名": "王五", "