📒 读取数据
本节介绍使用Recorder从文件读取数据。
✅️ rows()方法
此方法用于从文件读取指定数据。可根据条件获取多行。
每行数据是dict格式,键为表头值,如某行表头值为空,以列序号为键。
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
key_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] | 非 txt 格式文件返回RowData对象组成的列表 |
List[RowText] | txt 格式文件返回RowText对象组成的列表 |
说明
- txt 格式文件只有
begin_row和end_row参数有效
简单示例:
打印文件内所有数据。注意是从第二行开始,因为默认第一行是表头。
from DrissionRecord import Recorder
r = Recorder('data.csv')
for row in r.rows():
print(row)
✅️ 行数据对象
rows()方法返回的结果中,每行数据为一个RowData对象(txt 文件为RowText对象)。
RowData对象本身是一个dict,键为表头值或列序号(表头值为空的列)。还增加了行和列有关的属性和方法。
RowText对象是一个str,只比普通str多了row属性。
如果文件是 json 或 jsonl 格式,且行本身就是dict,就直接返回这个dict,而不匹配表头。
📌 RowData属性和方法
💡 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'))) # 与上一行一样,用列号定位
📌 获取行中的数据
除了上述info()方法,还可以用下标的方式获取行数据中指定列的数据。
有如下表格文件:
| 序号 | 姓名 | 性别 | 年龄 |
|---|---|---|---|
| 1 | 张三 | 男 | 20 |
| 2 | 李四 | 女 | 21 |
- 指定表头值:可用
row['姓名']获取每行'姓名'列数据 - 指定列序号:可用
row[2]获取每行第二列数据 - 指定列号:可用
row[Col('B')]获取每行第二列数据
✅️ 完整示例
有如下表格文件data.csv:
| 姓名 | 性别 | 班级 | 状态 |
|---|---|---|---|
| 刘一 | 男 | 一班 | |
| 陈二 | 女 | 二班 | ok |
| 张三 | 男 | 一班 | |
| 李四 | 女 | 一班 | ok |
| 王五 | 男 | 二班 | ok |
| 赵六 | 女 | 二班 |
📌 任务管理
有时我们要根据列表记录批量执行任务,根据每条任务的标记判断任务是否完成,并标注已的任务。
以便万一程序中断,下次可以直接执行未处理的任务。
利用rows()筛选功能,可把未处理的任务筛选出来处理,并在处理后填写标记。
from DrissionRecord import Recorder
r = Recorder('data.csv', cache_size=1) # 设置每接收一条数据保存一次
for row in r.rows(sign_col='状态'): # 按表头为“状态”的列为筛选条件,默认筛选此列为空的行
print(row['姓名'], row['性别'], row['班级'])
r.add_data('ok', (row.row, 'D')) # 在这行“状态”列写入“ok”
r.add_data('ok', row.coord('状态')) # 与上一行一样,换一种定位写法
r.add_data('ok', f'D{row.row}') # 与上一行一样,换一种定位写法
打印结果如下,并且这几行的状态一列已设为'ok'。
刘一 男 一班
张三 男 一班
赵六 女 一班
📌 拆分数据表
有时需要把一个数据表按照条件拆分为多个,可用rows()遍历数据,再插入到别的文件中。
还是使用上面的数据表。
from DrissionRecord import Recorder
r = Recorder('data.csv')
class1 = Recorder('class1.csv')
class2 = Recorder('class2.csv')
for row in r.rows():
if row['班级'] == '一班':
class1.add_data(row)
elif row['班级'] == '二班':
class2.add_data(row)
class1.record()
class2.record()