numpy 过滤和排序CSV数据并存储为PDF文件,在特定行后带有分页符

jtw3ybtb  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(107)

我使用Python脚本导入CSV数据,过滤和排序,将其转换为HTML,然后是PDF。我想找到一种在特定行后添加分页符的方法。
假设以下示例:
数据按列col1排序,形成“组”。我想在每个组后面添加一个分页符(col1中的新值):

  • 输入数据(CSV表)*

| col2| col3| col3 |
| --|--| ------------ |
| x轴|一个| a |
| 是的|B| b |
| x轴|一个| a |
| x轴|一个| a |
| 是的|B| b |
| x轴|一个| a |
| x轴|一个| a |
| 是的|B| b |

  • 输出数据(PDF格式的表格)*

(page添加分隔符,每页重复列标题)
| col2| col3| col3 |
| --|--| ------------ |
| x轴|一个| a |
| 是的|B| b |
| |||
| col2| col3| col3 |
| x轴|一个| a |
| x轴|一个| a |
| 是的|B| b |
| x轴|一个| a |
| |||
| col2| col3| col3 |
| x轴|一个| a |
| 是的|B| b |
我的工作流程大致如下:

df = pd.read_csv(input_filename, encoding="")

filtered_df = df[some_condition]

filtered_df = filtered_df.sort_values(some_other_condition)

html_table = filtered_df.to_html(index=False)

html_string = html_head + html_something + html_table + html_something_else + html_foot

pdfkit.from_string(html_string, outfile_name, options=pdfkit_options)

字符串
我看到了以下替代方法(但还不知道如何实现它们,我不喜欢其中任何一种):
1.解析数据并添加“ghost”行,不携带任何数据,但携带一些 magic string token,可以在HTML转换后由其他HTML magic(具有特定CSS样式的表行?)。感觉非常hacky。
1.将大表拆分为小表(每组一个-但如何拆分?)。将它们分别转换为HTML,然后再放回去(使用一些HTML/CSS魔法)。
1.使用一些我不知道的pdfkit选项或pandas.DataFrame.to_html选项。
1.使用完全不同的方法。
我事先并不知道col1包含的所有值,但是很容易找到它们,并重用它们进行进一步的处理。
任何帮助都非常感谢。

abithluo

abithluo1#

尝试以下操作:

html_page_break = '<div style="page-break-after: always;"></div>'
html_string = ''

html_tables = filtered_df.to_html(index=False)
for i, html_table in enumerate(html_tables):
    html_string += html_head + html_something + html_table + html_something_else + html_foot
    if i < len(html_tables) - 1:
        html_string += html_page_break

字符串
就像你做的那样:

pdfkit.from_string(html_string, outfile_name, options=pdfkit_options)

6psbrbz9

6psbrbz92#

我使用以下方法(OP的#2):
将单个表拆分为更小的表(“子表”),并将它们一个接一个地转换为HTML,将所有HTML表放在一起,中间有分页符。
1.获取group_column的唯一值(在我的示例中为col1
1.迭代这些组并过滤pandas.DataFrame以仅选择与该组匹配的行。
1.在每个组/表之后添加分页符(最后一个组/表之后除外)。

html_page_break = '<div style="page-break-after: always;"></div>'

 groups = filtered_df[group_column].unique()

 html_string = html_head + html_note

 for i, group in enumerate(groups):
     filtered_df_subtable = filtered_df[(filtered_df[group_column] == group)]
     html_table = filtered_df_subtable.to_html(index=False)
     html_string += html_table
     if i < len(groups) - 1:
         html_string += html_page_break

 html_string += html_foot

字符串
从HTML到PDF的转换是不变的。
感谢@notarealgreal的html_page_break + enumerate

相关问题