問(wèn)題:
我有一個(gè)數(shù)據(jù)結(jié)果,本來(lái)是以表格形式存儲(chǔ),多張圖片券腔,需要在數(shù)據(jù)生成過(guò)程中伏穆,保存到同一個(gè)文件中,方便后續(xù)查看纷纫,怎么做枕扫?
解決方法:
(1)文檔格式的選取:
txt / log:雖然可以存儲(chǔ)數(shù)據(jù)辱魁,但圖片無(wú)法保存
pdf: 可以同時(shí)保存數(shù)據(jù)和圖片烟瞧,但需要將數(shù)據(jù)轉(zhuǎn)為圖片形式保存(目前我了解的內(nèi)容)
doc: 可以同時(shí)保存數(shù)據(jù)和圖片,數(shù)據(jù)可按照自己想要的形式保存染簇,圖片也可寫(xiě)入
首選doc格式参滴,因此,下面主要介紹自己學(xué)習(xí)到的锻弓,如何將數(shù)據(jù)和圖片按照自己想要的格式保存到word中砾赔。
(2)需要存儲(chǔ)的數(shù)據(jù)形式:
? name? ? acc? ? recall? ? auc
? test_A? 0.734? 0.834? 0.843
? test_B? 0.765? 0.768? 0.921
? test_C? 0.875? 0.829? 0.897
該數(shù)據(jù)打印出來(lái)是看著像表格,其實(shí)是dataframe的形式打印青灼。
需要存儲(chǔ)的圖片在fig文件夾中暴心。
(3)開(kāi)始存儲(chǔ)
1)生成document生成器
注意:要先引入庫(kù) import docx
如果不存在,記著pip3 install docx 安裝一下哈
# 準(zhǔn)備文件聚至,開(kāi)始存儲(chǔ)數(shù)據(jù)和圖片
document = docx.Document()
# 給該文檔加上標(biāo)題add_heading酷勺,最后的1,表示該標(biāo)題為1級(jí)標(biāo)題
# 文檔中換行的命令為'\n'
document.add_heading(u'測(cè)試存儲(chǔ)數(shù)據(jù)和圖片到word文檔中\(zhòng)n\n',1)
2)保存表格信息
def save_df_to_doc(document, test_df):
? ? '''
? ? 將結(jié)果按照dataframe的形式存入doc文件
? ? :param document: 存入的文檔類(lèi)
? ? :param test_df: 需要保存的df
? ? :return:
? ? '''
? ? # add_paragraph表示添加一個(gè)段落
? ? document.add_paragraph(u'各個(gè)指標(biāo)的平均值表格\n')
? ? # 添加一個(gè)表格--行數(shù)和列數(shù)扳躬,行數(shù)多加一行脆诉,需要將列名同時(shí)保存
? ? t = document.add_table(test_df.shape[0] + 1, test_df.shape[1])
? ? # 將每列列名保存到表格中
? ? for j in range(test_df.shape[-1]):
? ? ? ? t.cell(0, j).text = test_df.columns[j]
? ? # 將每列數(shù)據(jù)保存到新建的表格中
? ? for i in range(test_df.shape[0]):
? ? ? ? for j in range(test_df.shape[-1]):
? ? ? ? ? ? # 第一行保存的是列名,所以數(shù)據(jù)保存時(shí)贷币,行數(shù)要加1
? ? ? ? ? ? t.cell(i + 1, j).text = str(test_df.values[i, j])
3)遍歷文件夾击胜,保存圖片
#將文件夾中的圖片,遍歷保存到document文件中
fig_path = os.path.join(CURRENT_DIR, 'fig/')
fig_list = os.listdir(fig_path)
for fig in fig_list:
? ? if '.jpg' in fig or '.png' in fig or '.jpeg' in fig:
? ? ? ? # 將已保存的png文件役纹,保存到word文檔中
? ? ? ? document.add_paragraph('\n\n\n' + fig + u'圖片顯示保存')? # 插入段落
? ? ? ? # add_picture表示在document中加入圖片偶摔,width表示圖片的大小,Inches英寸
? ? ? ? document.add_picture(fig_path + fig, width=Inches(6.5))? # 向文檔里添加圖片
4)保存結(jié)果
完整代碼如下:
import os
import pandas as pd
import docx
from docx.shared import Inches
CURRENT_DIR = os.path.abspath(os.path.dirname(__file__))
def save_df_to_doc(document, test_df):
? ? '''
? ? 將結(jié)果按照dataframe的形式存入doc文件
? ? :param document: 存入的文檔類(lèi)
? ? :param test_df: 需要保存的df
? ? :return:
? ? '''
? ? # add_paragraph表示添加一個(gè)段落
? ? document.add_paragraph(u'各個(gè)指標(biāo)的平均值表格\n')
? ? # 添加一個(gè)表格--行數(shù)和列數(shù)促脉,行數(shù)多加一行辰斋,需要將列名同時(shí)保存
? ? t = document.add_table(test_df.shape[0] + 1, test_df.shape[1])
? ? # 將每列列名保存到表格中
? ? for j in range(test_df.shape[-1]):
? ? ? ? t.cell(0, j).text = test_df.columns[j]
? ? # 將每列數(shù)據(jù)保存到新建的表格中
? ? for i in range(test_df.shape[0]):
? ? ? ? for j in range(test_df.shape[-1]):
? ? ? ? ? ? # 第一行保存的是列名,所以數(shù)據(jù)保存時(shí)瘸味,行數(shù)要加1
? ? ? ? ? ? t.cell(i + 1, j).text = str(test_df.values[i, j])
if __name__ == '__main__':
? ? # 生成要存儲(chǔ)的數(shù)據(jù)形式
? ? example_df = pd.DataFrame([])
? ? example_df['name'] = ['test_A', 'test_B', 'test_C']
? ? example_df['acc'] = [0.734, 0.765, 0.875]
? ? example_df['recall'] = [0.834, 0.768, 0.829]
? ? example_df['auc'] = [0.843, 0.921, 0.897]
? ? # 將name列設(shè)置為索引列
? ? # example_df = example_df.set_index('name')
? ? # 準(zhǔn)備文件宫仗,開(kāi)始存儲(chǔ)數(shù)據(jù)和圖片
? ? document = docx.Document()
? ? # 給該文檔加上標(biāo)題add_heading,最后的1旁仿,表示該標(biāo)題為1級(jí)標(biāo)題
? ? # 文檔中換行的命令為'\n'
? ? document.add_heading(u'測(cè)試存儲(chǔ)數(shù)據(jù)和圖片到word文檔中\(zhòng)n\n',1)
? ? # 將df保存到document中
? ? save_df_to_doc(document, example_df)
? ? #將文件夾中的圖片藕夫,遍歷保存到document文件中
? ? fig_path = os.path.join(CURRENT_DIR, 'fig/')
? ? fig_list = os.listdir(fig_path)
? ? for fig in fig_list:
? ? ? ? if '.jpg' in fig or '.png' in fig or '.jpeg' in fig:
? ? ? ? ? ? # 將已保存的png文件,保存到word文檔中
? ? ? ? ? ? document.add_paragraph('\n\n\n' + fig + u'圖片顯示保存')? # 插入段落
? ? ? ? ? ? # add_picture表示在document中加入圖片,width表示圖片的大小毅贮,Inches英寸
? ? ? ? ? ? document.add_picture(fig_path + fig, width=Inches(6.5))? # 向文檔里添加圖片
? ? # document要保存的地址和名字办悟,如果地址不存在,這生成該地址文件夾
? ? doc_save_path = os.path.join(CURRENT_DIR, 'result/')
? ? if not os.path.exists(doc_save_path):
? ? ? ? os.system('mkdir -p ' + doc_save_path)
? ? doc_name = 'test_result.docx'
? ? # 保存文檔
? ? document.save(doc_save_path + doc_name)? # 保存文檔