跳到主要内容

📒 读取数据


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

xlsx、csv、txt、jsonl 文件均是行结构,可用rows()方法获取遍历行,从中筛选获取需要的数据。

其中 xlsx 和 csv 还可根据表头或列序号在行数据中按列获取数据。

读取 json 文件时,需要文件是list{'键': [数据]}结构,可把列表视作多行读取。

xlsx 文件和{'键': [数据]}结构的 json 文件可用set.table()设置要读取的数据表或数据块。

✅️ rows()方法

Recorder对象的rows()方法用于从文件读取指定数据。可根据条件获取多行。

xlsx 文件可用set.table()指定读取某个数据表,json 文件用其设置读取指定数据块。

参数名称类型默认值说明
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]xlsx 和 csv 格式文件返回RowData对象组成的列表
List[RowText]txt 格式文件返回RowText对象组成的列表
List[RowDict, RowList]json 和 jsonl 格式文件返回RowDictRowList对象组成的列表(取决于该行类型)
说明

txt 格式文件只有begin_rowend_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 文件为RowDictRowList对象

RowDict是一个dict,增加了row属性表示行号,且可用序号切片读取数据,序号从1开始。

RowList是一个list,只比普通list多了row属性。

RowText对象是一个str,只比普通str多了row属性。

📌 RowData

RowData对象是 xlsx 和 csv 文件产生的行数据,本身是一个dict

键为表头值或列序号(表头值为空的列)。还增加了行和列有关的属性和方法。

💡 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'))) # 与上一行一样,用列号定位

💡 获取行中的数据

有如下表格文件:

序号姓名性别年龄
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_signTrue即可。

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_rowend_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 文件

{
"人员": [
{"姓名": "张三", "性别": "女"},
{"姓名": "李四", "性别": "男"},
{"姓名": "王五", "性别": "男"}
],
"部门": [
{"名称": "财务部", "位置": "305"},
{"名称": "人事部", "位置": "406"}
]
}

from DrissionRecord import Recorder

r = Recorder('data.json')
r.set.table('人员')
for row in r.rows():
print(row['姓名'])
张三
李四
王五

📌 任务管理

有如下表格文件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()