Skip to content

🐼 Filler

Filler专门用于处理表格文件,支持 xlsx 和 csv 两种格式。

它的用法非常灵活:

  • 可指定文件单元格坐标作为左上角,写入一片一维或二维数据

  • 可按条件获取列数据,并对相应列回写数据,用于记录工作状态,可实现断点续爬等功能

  • 可以给单元格设置连接

🐘 创建对象

Filler基本用法与Recorder一致,cache_size后面的参数与任务管理有关。

初始化参数 类型 默认值 说明
path str
Path
None 文件路径,若不存在会自动创建,如存在则在最后追加数据
cache_size int None 缓存数据条数,为0时不自动记录数据
key_cols str
int
list
tuple
True
True 作为关键字的列,可以是多列,可以是列编号,从1开始,True表示获取整行
begin_row int 2 数据开始的行,默认表头一行,数据从第 2 行开始
sign_col str
int
True
True 用于判断是否已填数据的列,可以是列编号或序号,从1开始,为True表示获取所有行,不进行判断
data_col int
str
None 要填入数据的开始列,可以接收列号数字或字母,从1开始,为None时与sign_col一致
sign Any None 按这个值筛选需要的行纳入keys
deny_sign bool False 是否反向匹配sign,即筛选sign_col列值不是sign的行
from DataRecorder import Filler

f = Filler(path='data.csv', cache_size=50)

🧾 指定工作表

可为记录器指定要操作的工作表,如工作表不存在,程序会自动创建。

如不对工作表进行任何设置,程序会使用活动工作表。

但只有 xlsx 文件可以指定。

📃 指定默认工作表

set.table()方法指定默认工作表,之后所有添加的数据都会默认添加到该工作表。

from DataRecorder import Filler

f = Filler('demo.xlsx')
f.set.table('sheet1')

📃 每个数据独立指定工作表

使用add_data()方法的table参数可为每条数据指定工作表。

f.add_data('abc', table='sheet2')

➕ 添加数据

使用add_data()方法添加数据。

每个数据可指定坐标。如不指定,默认在文件末尾添加。

数据可以是单个数据、一维列表、二维列表。会覆盖到以坐标为左上角的区域。

坐标的指定方式非常灵活,支持多种形式,支持只指定行或列,支持从后面向前数,具体见“进阶用法”章节。

✔ 添加单个或一维列表数据

f.add_data('abc', 'c3')  ## 在c3单元格填入一个数据
f.add_data((123, 456), (4, 4))  ##  在第4行第4列开始填入一行数据

文件内容:

abc
123 456

可见前两行是空行,数据从第三列第三行开始写入。


✔ 添加二维列表数据

这里继续使用刚才的文件,在刚才的基础上再填入一个二维数据。

data = ((1, 2), (3, 4))
f.add_data(data, 'b2')

文件内容:

1 2
3 4
123 456

可见,刚才的第二行已写入数据,第三行的 abc 已被覆盖。


✔ 不指定坐标添加数据

如添加数据时不传入坐标参数,程序会按照data_col值为列在文件末尾添加新行。

注:data_col默认是第 2 列。这里继续用上面的文件。

data = ((5, 6), (7, 8))
f.add_data(data)

文件内容:

1 2
3 4
123 456
5 6
7 8

除了使用data_col作为列外,还能在添加新行时实时设置列号。

f.add_data(data, 'd')

指定列号字母,不指定行号,表示在新行d列插入。


🔗 设置单元格链接

很多时候须要在 xlsx 文件里设置链接,可使用set_link()方法进行设置,用法和add_data()类似。

xlsx 和 csv 文件都支持。

f.set_link(coord='a5', link='https://www.baidu.com', content='百度')

这样设置即可对 A5 单元格设置指向该网址的链接,其中content参数是可选的。

link参数为None时,删除链接。


🖼️ 设置单元格图片

使用set_img()可向单元格插入或删除图片。

注意

使用此功能前必须先安装 Pillow 库。

pip install Pillow

🎨 插入图片

示例:

f = Filler()
f.set_img('A3', img_path='img.jpg')

插入图片时,可指定图片的宽和高,如果只指定其中之一,另一个值会自动按比例缩放。

示例:

f.set_img('A3', img_path='img.jpg', width=200, height=100)  # 指定图片大小
f.set_img('A3', img_path='img.jpg', width=200)  # 指定图片宽度,高度自动按比例设置
f.set_img('A3', img_path='img.jpg', height=100)  # 指定图片高度,宽度自动按比例设置

🎨 删除图片

img_path设置为None,可清除单元格内原有图片,此时widthheight参数无效。

示例:

f = Filler()
f.set_img('A3', img_path=None)

🌺 设置单元格样式

☘️ 使用方法

使用set_sytle()方法可对一个或多个单元格设置样式。此方法只支持 xlsx 格式文件。

创建CellStyle对象,传入此方法即可。CellStyle介绍详见相关章节。

可设置范围:

  • 单个单元格:传入单元格坐标
  • 整行:传入行号,int格式
  • 整列:传入列名,str格式
  • 指定范围:传入'A1:B3'格式字符串,指定一个矩形范围
from DataRecorder import Filler
from DataRecorder.style import CellStyle

f = Filler('demo.xlsx')
c = CellStyle()  # 创建样式对象
c.font.set_bold(True)  # 设置字体为加粗

f.set_style('A1', c)  # 设置A1单元格样式
f.set_style(2, c)  # 设置第2行整行样式
f.set_style('A', c)  # 设置A列整列样式
f.set_style('B3:D5', c)  # 设置矩形范围内单元格样式
f.record()

☘️ 设置方式

set_style()方法有两种设置方法,用replace参数控制。

replaceTure时,原有样式会被新样式完全替换,为False时则只覆盖被设置的样式项。

示例:

比如单元格字体原来是红色、加粗的,新样式把字体设置为绿色,没有指定是否加粗。

replaceTrue时,设置后单元格的字体加粗属性会被覆盖,而当replaceFalse时,单元格字体编程绿色,仍保留加粗的属性。

from DataRecorder import Filler
from DataRecorder.style import CellStyle

f = Filler('demo.xlsx')
c = CellStyle()
c.font.set_color('green')

f.set_style('a1', c, True)  # 所有font属性被覆盖
f.set_style('b1', c, False)  # 只有字体颜色被覆盖

f.record()

☘️ 清除单元格格式

如果要清除一个单元格所有格式,可新传入None

f.set_style('A1', None)

🔄 设置行高和列宽

↕️ 设置行高

使用set_row_height()方法设置行高。

示例:

f = Filler()
f.set_row_height(row=3, height=30)

↔️ 设置列宽

使用set_col_width()方法设置列宽。

列的指定既可使用序号,也可使用字母形式的列号。

示例:

f = Filler()
f.set_col_width(col=3, height=30)  # 传入列序号
f.set_col_width(col='c', height=30)  # 传入列号

💾 写入文件

这部分内容与Recorder一致。同样支持自动写入和手动写入。

🧭 灵活的坐标设置方式

🗺️ 指定精确坐标

Filler支持极其灵活的坐标设置方式,包括以下这些都是可以的:

  • excel 坐标方式。如 'A3'

  • 与上一条相反的行列顺序。如'3A'

  • 行列数字组成的元组或列表。如[2, 3](2, 3)表示第二行第三列。

  • 字母列号。如[2, 'a']表示第二行 A 列。

  • 字符串行列号。如'2,3''2,c'表示第二行第三列。

  • 行号为None'newline'表示新增一行。如(None, 3)表示新行第三列。

  • 行号和列号都支持负数,表示从后往前数。如(-3, -3)表示倒数第三行倒数第三列;'a-3'表示倒数第三行的 A 列。

🗺️ 不指定精确坐标

add_data()设置坐标时,除了设置完整坐标,还可以如下设置:

  • 不传入坐标,表示新行,列号使用data_col参数的值。如f.add_data(data)表示新行data_col列。

  • 只传入数字,表示行数,列号使用data_col参数的值。如f.add_data(data, 3)表示第三行data_col列。

  • 只传入字母,表示列号,并新建一行。如f.add_data(data, 'c')表示新行 C 列。

注意

负值列号要慎用,通常只用在数据不会超出最大列的情况。因为如果数据超过了最大列,保存文件后最大列的列号就会产生变化,导致错位。


📝 任务管理功能

📃 示例

假设现在有一个表格,里面记录着要下载的文件 url,需设计一个程序把文件下载到指定地方,并把路径填写回相应的列,并在表格文件中设置点击即可打开的链接。

在下载过程中,网络可能不稳定,有中途中断的可能性。那么如何能够方便快捷地完成上面的任务呢?

Filler集成了这样的功能,提供了基本的任务管理功能,下面以一个例子来说明。

任务清单文件:

URL 已下载 保存路径
https://dldir1.qq.com/qqfile/qq/PCQQ9.6.1/QQ9.6.1.28732.exe
https://dldir1.qq.com/qqfile/qq/TIM3.3.9/TIM3.3.9.22051.exe
https://dldir1.qq.com/qqfile/QQforMac/QQ_6.7.9.21089_961_EXP.dmg

可见表格文件里第一列是要下载的文件 url,第二列用于标记是否已下载,第三列下载后回填保存路径。

我们可以给Filler指定第一列为 key 列,第二列为 sign 列。程序可以根据 sign 内容判断哪些行是须要执行任务的,用keys 属性获取要执行的任务数据,然后把执行结果回填到 sign 列,如果中途中断了,下次执行会从 sign 列为空的行继续执行。

创建对象,并把 keys 打印出来看看:

from DataRecorder import Filler

f = Filler('data.csv', key_cols=1, sign_col=2)
for key in f.keys:
    print(key)

输出:

['https://dldir1.qq.com/qqfile/qq/PCQQ9.6.1/QQ9.6.1.28732.exe']
['https://dldir1.qq.com/qqfile/qq/TIM3.3.9/TIM3.3.9.22051.exe']
['https://dldir1.qq.com/qqfile/QQforMac/QQ_6.7.9.21089_961_EXP.dmg']

可见Filler获取到 3 个任务,其中第一位的数字是该任务的行数,等下要根据这个行数给表格文件回填数据。

下面我们逐个任务执行,使用 DownloadKit 库执行下载。

from DataRecorder import Filler
from DownloadKit import DownloadKit

d = DownloadKit('files')  # 创建DownloadKit对象,指定下载路径
f = Filler('data.csv', key_cols=1, sign_col=2)
for key in f.keys:  # 遍历任务
    url = key[0]
    mission = d.add(url)  # 新建下载任务
    mission.wait()  # 等待下载完成
    path = mission.path  # 获取保存路径
    f.add_data(('ok', path), key.row)  # 回填到表格文件

现在表格文件内容为:

URL 已下载 保存路径
https://dldir1.qq.com/qqfile/qq/PCQQ9.6.1/QQ9.6.1.28732.exe ok D:\files\QQ9.6.1.28732.exe
https://dldir1.qq.com/qqfile/qq/TIM3.3.9/TIM3.3.9.22051.exe ok D:\files\TIM3.3.9.22051.exe
https://dldir1.qq.com/qqfile/QQforMac/QQ_6.7.9.21089_961_EXP.dmg ok D:\files\QQ_6.7.9.21089_961_EXP.dmg

假如某种原因导致程序中断了,那未执行的行的 sign 列就不会填上'ok',下次再执行程序时,会忽略已填写的行,继续执行未完成的行。从而实现任务的断点继续执行。


📃 说明

  • 每一行数据都有row属性,说明数据是第几行的。

  • 上面的示例中,add_data()第二个参数只填写了行号,那是因为设置了data_col属性,默认回填在data_col属性指定的列。

  • 示例中没有显式指定data_col属性,是因为默认情况下与sign_col一致。如果不一致,可以另外指定。

  • key_cols参数可以指定多列,传入列号组成的列表即可,列号可以用字母或数字。会返回多个 key 值(行号依然是第一位)。

  • key_cols默认为True,表示获取所有列。

  • 如果一行中要回填的数据不连续,那可以用多个add_data()方法填写,每个方法传入单元格坐标,如add_data(data, (row, 'd')

  • 默认情况下sign参数为None,即单元格内容为空就认为这行是未执行的。可以通过sign参数设置其它值。如设置'未执行'为标记。

  • sign_col默认为True,表示不进行筛选,直接获取所有行。此时data_col值默认为1

  • deny_sign参数如果为True,表示筛选sign_col列值不是sign的行


📝 dict_keys

上面的示例中,keys返回的数据是list形式,需用序号访问数据,程序可读性不强。

使用dict_keys属性,可以dict格式返回数据,其中的键名则是标题行或行号,可读性更强。

📃 示例

假如有如下文件:

姓名 性别 年龄
张三 20
李四 25

dict_keys打印每行数据:

filler = Filler('demo.xlsx')
for row in filler.dict_keys:
    print(row)

输出:

{'姓名': '张三', '性别': '男', '年龄': 20}
{'姓名': '李四', '性别': '女', '年龄': 25}

📃 首行为数据时

如果文件首行为数据而非表头,则会使用英文列号作为键名。

示例:

filler = Filler('demo.xlsx')
filler.set.begin_row(1)
for row in filler.dict_keys:
    print(row)

输出:

{'A': '姓名', 'B': '性别', 'C': '年龄'}
{'A': '张三', 'B': '男', 'C': 20}
{'A': '李四', 'B': '女', 'C': 25}

📃 表头项缺失时

如果表头有的列内容为空,则自动使用该列英文列号作为键名。

示例:

注意第二列表头为空

姓名 年龄
张三 20
李四 25
filler = Filler('demo.xlsx')
for row in filler.dict_keys:
    print(row)

输出:

数据中第二列以列号代替空表头。

{'姓名': '张三', 'B': '男', '年龄': 20}
{'姓名': '李四', 'B': '女', '年龄': 25}

♾️ Filler 对象的方法

📌 add_data()

此方法用于添加数据到缓存,可接收一个、一维或二维数据。当接收的是二维数据时,会填充到以指定坐标为左上角的区域中。

参数名称 类型 默认值 说明
data Any 必填 可接收任意格式,接收一维listtupledict时记录为一行,接收二维数据时记录为多行
coord list
int
str
tuple
None
必填 要添加数据的坐标,可输入行号、列号或行列坐标,如'a3'、7、(3, 1)、[3, 1]、'c'。也可以是负数,代表从下往上数,-1 是倒数第一行;为None时表示新增行
table str
bool
None
None 当前数据要插入的表格名称,仅支持 xlsx 格式。为None表示用set.table()方法设置的值,为bool表示活动的表格

返回:None


📌 set_img()

此方法用于插入图片到单元格。

可设置图片大小,如只设置宽或高其中一个,另一个值会按比例缩放。

宽高都为None时不改变图片大小。

参数名称 类型 默认值 说明
coord int
str
tuple
list
必填 单元格坐标
img_path str
Path
None
必填 图片路径,为None时清除单元格原有图片
width float
None
None 图片宽度
height float
None
None 图片高度
table str
bool
None
None 当前数据要插入的表格名称,仅支持 xlsx 格式。为None表示用set.table()方法设置的值,为bool表示活动的表格

返回:None


此方法用于为单元格设置超链接。

参数名称 类型 默认值 说明
coord int
str
tuple
list
必填 单元格坐标
link str
None
必填 超链接文本,为None时删除链接
content str None 单元格内容
table str
bool
None
None 当前数据要插入的表格名称,仅支持 xlsx 格式。为None表示用set.table()方法设置的值,为bool表示活动的表格

返回:None


📌 set_style()

此方法用于为单元格设置样式。

输入数字可设置整行,输入列名字符串可设置整列,输入'A1:C5'格式可指定范围。

replace 参数为True时,会用样式对象直接替换单元格原有样式对象,即使未被设置的项也会替换。为False时,只替换在CellStyle 中设置的项。为True时运行效率比较高。

参数名称 类型 默认值 说明
coord int
str
tuple
list
必填 单元格坐标、行号、列号或范围
style CellStyle
None
必填 样式对象,为None时清除单元格样式
replace bool True 是否直接替换已有样式
table str
bool
None
None 当前数据要插入的表格名称,仅支持 xlsx 格式。为None表示用set.table()方法设置的值,为bool表示活动的表格

返回:None

示例:

from DataRecorder import Filler
from DataRecorder.style import CellStyle

f = Filler('demo.xlsx')
c = CellStyle()
c.font.set_color('FF6100')

f.set_style('a3:c5', c)  # 设置范围单元格样式
f.record()

📌 set_row_height()

此方法用于设置行高。

参数名称 类型 默认值 说明
row int 必填 行号
height float 必填 行高
table str
bool
None
None 当前数据要插入的表格名称,仅支持 xlsx 格式。为None表示用set.table()方法设置的值,为bool表示活动的表格

返回:None


📌 set_col_width()

此方法用于设置行高。

参数名称 类型 默认值 说明
col int
str
必填 列序号或列号
width float 必填 列宽
table str
bool
None
None 当前数据要插入的表格名称,仅支持 xlsx 格式。为None表示用set.table()方法设置的值,为bool表示活动的表格

返回:None


📌 record()

此方法用于把数据记录到文件,然后清空缓存。可把数据保存到一个新文件。

参数名称 类型 默认值 说明
new_path str
Path
None 文件另存为的路径,会保存新文件
返回类型 说明
str 文件路径

📌 clear()

此方法用于清空现有缓存。

参数:无

返回:None


⚙️ Filler 对象参数设置

Filler对象的设置使用set.****()的方式进行。

可进行链式操作,如set.fit_head().cache_size(30)

📌 set.path()

此方法用于设置文件路径,更改时会自动保存缓存数据到文件。

参数名称 类型 默认值 说明
path str
Path
None 文件路径,为None时不修改原有设置
key_cols str
int
list
tuple
True
None 作为关键字的列,可以是多列,可以是列编号,从1开始,True表示获取整行,为None时不修改原有设置
begin_row int None 数据开始的行,为None时不修改原有设置
sign_col str
int
True
None 用于判断是否已填数据的列,可以是列编号或序号,从1开始,为True表示获取所有行,为None时不修改原有设置
data_col str
int
None 要填入数据的开始列,可以接收列号数字或字母,从1开始,为None时不修改原有设置
sign Any None 按这个值筛选需要的行纳入keys,为None时不修改原有设置
deny_sign bool None 是否反向匹配sign,即筛选指不是sign的行,为None时不修改原有设置

返回: 当前设置对象


📌 set.cache_size()

此方法用于设置缓存大小,指定采集多少条自动记录到文件,为0时不自动记录。

参数名称 类型 默认值 说明
size int 必填 缓存数据条数

返回: 当前设置对象


📌 set.file_type()

此方法用于指定文件类型,无视文件后缀名。

参数名称 类型 默认值 说明
file_type str 必填 在两种支持的类型中选择

返回: 当前设置对象


📌 set.table()

此方法用于处理 xlsx 文件时指定数据表。

参数名称 类型 默认值 说明
name str
None
bool
必填 数据表名称,为bool时使用活动数据表

返回: 当前设置对象


📌 set.head()

此方法用于给表格文件设置表头,只支持 csv 和 xlsx 格式文件。

参数名称 类型 默认值 说明
head list
tuple
必填 表头内容
table str None 要设置的表名称,为None则设置活动表格
to_file bool True 是否改变文件中的表头,如为False可使运行时使用的表头和文件的不一致

返回: 当前设置对象


📌 set.fit_head()

此方法用于设置数据是否自动匹配表头。

当数据为dict格式,且不指定列时,数据才会自动匹配表头。

参数名称 类型 默认值 说明
on_off bool True bool类型表示开或关

返回: 当前设置对象


📌 set.before()

此方法用于设置对象before参数内容,设置前会先保存缓存数据。

before内容的用法将在 “进阶用法” 章节说明。

参数名称 类型 默认值 说明
before Any 必填 每行数据前要添加的内容,单个数据或列表数据皆可

返回: 当前设置对象


📌 set.after()

此方法用于设置对象after参数内容,设置前会先保存缓存数据。

after内容的用法将在 “进阶用法” 章节说明。

参数名称 类型 默认值 说明
after Any 必填 每行数据后要添加的内容,单个数据或列表数据皆可

返回: 当前设置对象


📌 set.encoding()

此方法用于设置编码格式。

参数名称 类型 默认值 说明
encoding str 必填 编码名称

返回: 当前设置对象


📌 set.delimiter()

此方法用于设置 csv 文件分隔符,csv 格式时才生效。

参数名称 类型 默认值 说明
delimiter str 必填 csv 文件分隔符

返回: 当前设置对象


📌 set.quote_char()

此方法用于设置 csv 文件引用符,csv 格式时才生效。

参数名称 类型 默认值 说明
quote_char str 必填 csv 文件引用符

返回: 当前设置对象


📌 set.show_msg()

此方法用于设置是否显示运行信息。

参数名称 类型 默认值 说明
on_off bool 必填 bool类型表示开或关

返回: 当前设置对象


📌 set.sign()

此方法用于设置keys的筛选条件值。

参数名称 类型 默认值 说明
value Any 必填 筛选条件

返回: 当前设置对象


📌 set.deny_sign()

此方法用于设置是否反向匹配sign

参数名称 类型 默认值 说明
on_off bool 必填 bool类型表示开或关

返回: 当前设置对象


📌 set.key_cols()

此方法用于设置作为关键字的列,可以是多列,为True时获取所有列。

参数名称 类型 默认值 说明
cols str
int
list
tuple
True
必填 列号或列名,或它们组成的列表,或者是True

返回: 当前设置对象


📌 set.sign_col()

此方法用于设置标记列,该列用于判断每行任务是否已完成。

参数名称 类型 默认值 说明
col str
int
必填 列号或列名

返回: 当前设置对象


📌 set.data_col()

此方法用于设置填充数据的列。

参数名称 类型 默认值 说明
col str
int
必填 列号或列名

返回: 当前设置对象


📌 set.begin_row()

此方法用于设置数据开始的行。

参数名称 类型 默认值 说明
row int 必填 行号

返回: 当前设置对象


此方法用于设置单元格的链接样式。

参数名称 类型 默认值 说明
style CellStyle 必填 CellStyle对象

返回: 当前设置对象


🔣 Filler 对象的属性

📌 path

此属性以字符串方式返回当前记录的文件路径。可赋值设置。更改时会自动保存缓存数据到文件。

类型:str


📌 type

此属性以字符串方式返回当前文件的类型。可赋值设置,即可无视文件后缀指定记录格式。

类型:str


📌 data

此属性返回当前保存在缓存里的数据。

返回类型 说明
list 非 xlsx 格式文件以list格式返回结果
dict xlsx 格式文件时以dict格式返回结果

📌 cache_size

此属性返回缓存的大小,表示记录的条数。

类型:int


📌 table

此属性返回当前处理的数据表,处理 xlsx 文件时才生效。

返回类型 说明
str 设置具体表名时返回表名字符串
None None时表示记录到活动表格

📌 encoding

此属性返回当前文件的编码方式,默认为'utf-8'

类型:str


📌 delimiter

此属性返回 csv 文件使用的分隔符,默认为','

文件格式为 csv 时才生效。

类型:str


📌 quote_char

此属性返回csv 文件使用的引用符,默认为'"'

文件格式为 csv 时才生效。

类型:str


📌 before

此属性返回当前对象设置的before内容,before参数内容的用法将在 “进阶用法” 章节说明。

类型:Any


📌 after

此属性返回当前对象设置的after内容,after参数内容的用法将在 “进阶用法” 章节说明。

类型:Any


📌 show_msg

此属性用于设置是否打印程序运行时产生的提示信息。

类型:bool


📌 key_cols

此属性返回作为关键字的列或列的集合。

列号可以重复,返回的 keys 内容会重复按顺序出现。

返回类型 说明
List[int] 返回keys要获取的列号组成的列表
True True表示获取所有列

📌 keys

此属性返回一个列表,由未执行的行数据组成。每行的格式为第一位为行号,其余为 key 列的值。

如:[3, '张三', 20]

类型:list


📌 sign_col

此属性返回用于判断是否已填数据的列。列号可以是数字或字母。可赋值设置。

返回类型 说明
int 用于筛选keys的列号
True True表示获取所有行,不筛选

📌 data_col

此属性返回用于填充数据的列,不设置时与sign_col一致。列号可以是数字或字母。可赋值设置。

类型:int


📌 begin_row

此属性返回数据开始的行号(跳过表头),用于获取keys,从1开始。可赋值设置。

类型:int