跳到主要内容

📒 读取数据

本节介绍使用Recorder从文件读取数据。

✅️ rows()方法

此方法用于从文件读取指定数据。可根据条件获取多行。

每行数据是dict格式,键为表头值,如某行表头值为空,以列序号为键。

参数名称类型默认值说明
key_colsstr
int
list
True
True作为关键字的列,可以是多列,传入str代表表头值,传入int代表列序号,为True获取所有列
sign_colstr
int
True
True用于筛选数据的列,传入str代表表头值,传入int代表列序号,为True获取所有行
signsAnyNone按这个值筛选目标行,可用列表设置多个
deny_signboolFalse是否反向匹配sign,即筛选sign_col列的值不是sign指定值的行
countintNone获取多少条数据,为None获取所有
begin_rowint
None
None数据开始的行,None表示header_row后面一行
end_rowint
None
None数据结束的行,None表示最后一行
返回类型说明
List[RowData]非 txt 格式文件返回RowData对象组成的列表
List[RowText]txt 格式文件返回RowText对象组成的列表
说明
  • txt 格式文件只有begin_rowend_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_numstr
int
必填某列,为int时表示列序号,为str时表示表头值
col_numboolFalse列以列号还是列序号形式返回
返回格式说明
(int, str)col_numFalse时返回格式为(1, 'A')
(int, int)col_numTrue时返回格式为(1, 1)

💡 col()

此方法返回数据中指定列的列号或列序号。

参数名称类型默认值说明
key_or_numstr
int
必填某列,为int时表示列序号,为str时表示表头值
as_numboolTrue以列号还是列序号形式返回
返回类型说明
stras_numFalse时返回格式为'A'
intas_numTrue时返回格式为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()