如何在Python中遍历值列表并生成PDF?
我正在尝试使用urllib和tableau_api_lib来提取数据,以便根据Tableau中某个视图的过滤数据创建PDF。我已经把这一部分搞定了,但我需要帮助来循环处理ID列表,然后创建一个字典(这是生成PDF所必需的)。接着,基于这些参数,生成输出,使得PDF的名称与test_loop中的ID相同。我可以让它在没有循环的情况下处理一条记录。
test_loop = ['202','475','78','20','10']
for item in test_loop:
tableau_filter_value = parse.quote(item)
pdf_params = {
"pdf_orientation":"orientation=Landscape",
"pdf_layout":"type=A4",
"filter_vendor": f"vf_{tableau_filter_field}={tableau_filter_value}",
}
for params in pdf_params:
with open('output{test}.pdf'.format(test=params),'wb') as file:
file.write(conn.query_view_pdf(view_id = pdf_view_id, parameter_dict=params).content)
简单来说,PDF应该命名为output202.pdf,并且应该包含来自上面pdf_params字典的数据。所以,我期待根据这个列表生成5个不同的PDF。我对Python还不是很熟悉,所以任何帮助都很有用!
出现了错误:AttributeError: 'str' object has no attribute 'keys'
++++ tableau_filter_field在这段代码之前已经定义过了。
1 个回答
0
首先,我觉得创建一个PDF文件和创建一个.txt文件是不一样的。你不能像创建.txt或.csv文件那样,直接创建一个叫做a.pdf的文件,然后就得到一个PDF文件。你可能会看到文件被创建了,但它们实际上并不是PDF格式的文件,而很可能是一个后缀名为.pdf的文本文件。
你可以查看这个关于PDF的讨论 - 如何在Python中创建PDF文件
只有一个记录被创建并不奇怪,因为在每次循环中,那个字典变量pdf_params都是被覆盖的。
你可以这样做。
list_of_params = list()
for item in test_loop:
tableau_filter_value = parse.quote(item)
pdf_params = {
"pdf_orientation":"orientation=Landscape",
"pdf_layout":"type=A4",
"filter_vendor": f"vf_{tableau_filter_field}={tableau_filter_value}",
}
list_of_params.append(pdf_params)
然后你可以遍历参数列表,把它们填充到文件中:
for params in list_of_params:
# write to pdf
for params in pdf_params:
这段代码实际上是在遍历字典pdf_params的键,所以会出现关于字符串属性的错误。