我正在尝试使用 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”对象没有属性“keys”
++++ tableau_filter_field 在此代码之前定义。
首先,我不认为创建 pdf 与创建 .txt 文件类似。您无法创建名为 a.pdf 的文件,然后获取 pdf 文件,就像处理 .txt 或 .csv 或其他任何文件一样。您可能会创建文件,但它们不会是 pdf 格式文件,而很可能是扩展名为 .pdf 的 txt 文件。
您可以在 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:
实际上会迭代 dict pdf_params 的键,因此会出现 str 属性的错误。