📒 读取数据
本节介绍使用Recorder
从文件读取数据。
✅️ rows()
方法
此方法用于从文件读取指定数据。可根据条件获取多行。
每行数据是dict
格式,键为表头值,如某行表头值为空,以列序号为键。
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
key_cols | str int list True | True | 作为关键字的列,可以是多列,传入str 代表表头值,传入int 代表列序号,为True 获取所有列 |
sign_col | str int True | True | 用于筛选数据的列,传入str 代表表头值,传入int 代表列序号,为True 获取所有行 |
signs | Any | None | 按这个值筛选目标行,可用列表设置多个 |
deny_sign | bool | False | 是否反向匹配sign ,即筛选sign_col 列的值不是sign 指定值的行 |
count | int | None | 获取多少条数据,为None 获取所有 |
begin_row | int None | None | 数据开始的行,None 表示header_row 后面一行 |
end_row | int None | 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 | str int | 必填 | 某列,为int 时表示列序号,为str 时表示表头值 |
col_num | bool | False | 列以列号还是列序号形式返回 |
返回格式 | 说明 |
---|---|
(int, str) | col_num 为False 时返回格式为(1, 'A') |
(int, int) | col_num 为True 时返回格式为(1, 1) |
💡 col()
此方法返回数据中指定列的列号或列序号。
参数名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
key_or_num | str int | 必填 | 某列,为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()