Record_ 03_读取文件夹下所有图片文件并将模型输出概率依次写入Excel表格中

这段代码演示了如何利用Python读取C盘下picture文件夹中的1000张图片,通过预定义的模型进行处理,并将模型输出的每张图片正负样本的概率写入E盘pro_data/users.xlsx Excel表格中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设C盘下有picture文件夹下有1000张图片,依次读取该文件夹下图片并将模型输出概率依次写入Excel表格中的操作如下:

import os
import cv2
import torch
import openpyxl

def test(cfg):
	path = 'C:/picture'
	
	path_list = os.listdir(path)
	prob_list = []
	for filename in path_list:
	    image_path = os.path.join(path, filename)
	    model.eval()
	    image = cv2.imread(image_path)
	    
	# 这里是对读入的图片进行预处理的操作
	    im = (image - 127.5) * 0.0078125
	    in_img = cv2.resize(im, (cfg.input_shape[2], cfg.input_shape[1]))
	    # 转成 c h w, tensor
	    in_img = torch.from_numpy(in_img.transpose((2, 0, 1)))
	    in_img = in_img.type(torch.FloatTensor)
	    in_img = in_img.unsqueeze(0)
	  
	    # model是网络模型,该句的意思是将处理的图片读入到模型中,参数out是模型输出
	    out = model(in_img.to(device))
	  
	    # out[0]表示图片是负样本的概率,out[1]表示图片是正样本的概率
	    prob = out[0] # shape [n_boxes, 2]
	    
	    # 将GPU上tensor类型的pro列表转换成CPU上的tensor   
	    prob = torch.squeeze(prob)   
	    prob = prob.cpu().data.numpy()
	    prob_list.append(prob[0])
	
	# 返回一个numpy类型的列表    
	return prob_list

# 将数据写入E盘下pro_data文件夹下文件名为users.xlsxexcel的Excel表格中
def data_write(datas):
    execl_path = 'E:/pro_data/users.xlsx'
    mywb = openpyxl.Workbook()
    #index表示这是第几张工作表,从零开始;,title是工作表的名字
    mywb.create_sheet(index=0,title='Sheet1') 
    sheet_names=mywb.get_sheet_names()
    mysheet = mywb.get_sheet_by_name('Sheet1')
        
    #将数据写入第 i 行,第 j 列,参数A表示Excel表格中的A列
    i = 0
    for i in range(len(datas)):
        mysheet['A'+str(i+1)] = datas[i]
        i = i + 1
    mywb.save(execl_path) #保存文件

if __name__ == "__main__":
    args = parse_args()
    cfg = parse_config(args.yaml)
    datas = test(cfg)
    # 将返回的numpy类型的prob_list列表依次写入到Excel表格中
	data_write(datas)



文章最后有微信公众号:惟CPP,欢迎关注,一起交流学习进步~

<think>好的,我需要帮助用户开发一个程序,自动读取文件夹下的Excel文件内容替换到Word文档中。首先,我得理清楚用户的需求。他们想要将Excel中的数据自动填充到Word的特定位置,可能是模板中的占位符替换。 首先,我需要确定使用哪些库来处理Excel和Word文件。Python的话,常用的Excel处理库有openpyxl和pandas,而Word处理可以用python-docx。另外,替换内容可能需要查找特定的占位符,比如用{{key}}这样的格式。接下来,步骤大概分为几个部分:读取Excel文件的数据,读取Word模板,进行替换,然后保存新的Word文档。可能需要遍历文件夹中的所有Excel文件,每个文件对应生成一个Word文档。 然后,具体实现时,需要处理Excel的每个单元格数据,可能每个sheet或行对应不同的数据。而Word中的替换可能需要遍历所有段落和表格,查找替换占位符。比如,在Word中,每个段落中的文本如果有{{name}},就替换成Excel中的对应值。 另外,需要考虑Excel和Word的数据结构如何对应。比如,用户可能希望Excel中的每一行对应一个Word文档,或者每个Excel文件对应一个文档。需要和用户确认,但假设每个Excel文件的一个sheet中的数据对应替换一个Word模板。 可能的代码结构:使用os模块遍历文件夹,用openpyxl读取Excel数据存储为字典,然后用python-docx读取Word模板,替换文本后保存。需要注意的是,替换时要处理段落和表格中的文本,因为python-docx中表格的文本处理稍微复杂。还可能遇到的问题是,如何处理多个占位符,或者Excel中的数据有多个条目需要替换到不同的位置。比如,一个Excel行中的多个列对应不同的占位符。这时候可能需要将Excel的每一行作为一个数据记录,生成多个Word文件,或者合到一个文件里,但根据用户的问题描述,可能是一个Excel文件对应一个Word文件的替换。 此外,异常处理也需要考虑,比如Excel文件损坏,或者占位符不匹配的情况。但用户可能暂时不需要这么复杂,先实现基本功能。 测试部分,需要确保替换后的Word文档正确显示Excel中的数据,且格式保持不变。可能需要处理不同的数据类型,比如日期、数字格式,但暂时假设数据都是字符串。 现在,编写代码的大致步骤: 1. 遍历指定文件夹中的所有Excel文件。 2.对于每个Excel文件读取数据(假设使用第一个sheet,或者用户指定)。 3.将数据转换为字典形式,比如{'name': 'John', 'age':'30'}。4. 加载Word模板文件。5. 在Word文档中查找所有占位符(如{{name}})用对应的数据替换。 6. 保存新的Word文档,文件名可能根据Excel文件名生成。 接下来,具体代码实现:使用openpyxl读取Excel,假设Excel文件的第一行为列名,后续行是数据。可能需要处理多行数据的情况,但用户的问题中可能每个Excel文件对应一个数据记录,所以假设每个Excel文件只有一行数据(除了标题)。或者可能需要处理多行,生成多个Word文件。但根据常见情况,可能每个Excel文件对应一个Word文件,其中包含该Excel中的数据替换。或者,可能每个Excel文件中有多个工作表,每个工作表对应不同的数据。需要进一步假设,但用户可能希望每个Excel文件的数据替换到同一个Word模板的不同位置。现在,先以单个数据行的情况处理,即每个Excel文件读取第一行数据作为替换的数据。 在代码中,可能需要遍历每个Excel文件读取其内容,然后替换到Word模板中,保存为新的文件。例如,代码的大纲: import osfrom openpyxl import load_workbook fromdocx import Documentdef read_excel_data(excel_path): wb = load_workbook(excel_path) sheet= wb.activedata ={} #假设第一行是键,第二行是值for row in sheet.iter_rows(min_row=1, max_row=2,values_only=True):if row ==sheet.iter_rows(min_row=1,max_row=1).values_only=True: #第一行是键keys =row else: values =row data= dict(zip(keys, values)) return datadef replace_in_word(template_path, data, output_path): doc= Document(template_path) forpara in doc.paragraphs:for key, valuein data.items():if f'{{{{{key}}}}}' in para.text: para.text = para.text.replace(f'{{{{{key}}}}}', str(value))# 处理表格中的替换for table indoc.tables:for row intable.rows:for cell inrow.cells:for key,value in data.items(): if f'{{{{{key}}}}}' incell.text:cell.text = cell.text.replace(f'{{{{{key}}}}}', str(value)) doc.save(output_path) defprocess_files(excel_folder, template_path, output_folder):for filename inos.listdir(excel_folder):if filename.endswith('.xlsx')or filename.endswith('.xls'):excel_path =os.path.join(excel_folder, filename) data =read_excel_data(excel_path)output_name =f"output_{os.path.splitext(filename)[0]}.docx" output_path = os.path.join(output_folder,output_name)replace_in_word(template_path, data, output_path)print(f"Generated: {output_path}") #使用示例process_files('excel_files', 'template.docx', 'output_docs')不过,上述代码可能有错误,比如读取Excel数据的方式。正确的读取方式可能需要遍历行,处理多行的情况。例如,假设每个Excel文件中有多行数据,每行生成一个Word文件。或者每个Excel文件只有一行数据(除标题外)。需要调整read_excel_data函数,可能返回一个列表,每个元素是一个字典,对应一行数据。然后,在process_files中遍历每个数据字典,生成对应的Word文件。 例如,修改后的read_excel_data: defread_excel_data(excel_path):wb =load_workbook(excel_path)sheet = wb.activedata_list = []keys = Nonefor rowin sheet.iter_rows(values_only=True):if keys isNone: keys= row #第一行为键else:data = dict(zip(keys, row))data_list.append(data) return data_list 然后,process_files中对于每个数据项生成一个Word文件:def process_files(excel_folder, template_path, output_folder): for filenamein os.listdir(excel_folder):if filename.lower().endswith(('.xlsx','.xls')): excel_path= os.path.join(excel_folder,filename) data_list = read_excel_data(excel_path) fori, data inenumerate(data_list):output_name =f"output_{os.path.splitext(filename)[0]}_{i+1}.docx" output_path = os.path.join(output_folder,output_name)replace_in_word(template_path, data, output_path)print(f"Generated: {output_path}") 这样,每个Excel文件中的每一行数据都会生成一个对应的Word文件。这可能更符合用户需求,但需要用户确认是否每个行对应一个文档。比如,Excel中有多个客户的信息,每行一个客户,需要生成多个Word文档。 另外,在替换Word中的内容时,除了段落,还需要处理表格内的文本。当前的replace_in_word函数已经处理了段落和表格,但可能需要更仔细的测试。可能的错误:在替换文本时,如果段落中有多个占位符或者嵌套的情况,可能需要更复杂的处理。但当前使用简单的replace方法可能足够。 还需要确保Excel中的键与Word模板中的占位符完全匹配,包括大小写。综上,给出代码示例,解释每个步骤。然后提出相关问题。</think>以下是一个使用Python实现自动读取Excel数据替换Word模板的解决方案: ```python import os from openpyxl import load_workbook from docx import Document def read_excel_data(excel_path): """读取Excel文件内容返回字典列表""" wb = load_workbook(excel_path) sheet = wb.active data = [] # 获取标题行 headers = [cell.value for cell in sheet[1]] # 遍历数据行 for row in sheet.iter_rows(min_row=2): row_data = {} for idx, cell in enumerate(row): row_data[headers[idx]] = cell.value data.append(row_data) return data def replace_in_doc(template_path, output_path, replacements): """替换Word文档中的占位符""" doc = Document(template_path) # 替换段落中的内容 for para in doc.paragraphs: for key, value in replacements.items(): if f'{{{{{key}}}}}' in para.text: para.text = para.text.replace(f'{{{{{key}}}}}', str(value)) # 替换表格中的内容 for table in doc.tables: for row in table.rows: for cell in row.cells: for key, value in replacements.items(): if f'{{{{{key}}}}}' in cell.text: cell.text = cell.text.replace(f'{{{{{key}}}}}', str(value)) doc.save(output_path) def process_files(excel_folder, template_path, output_folder): """处理整个文件夹Excel文件""" if not os.path.exists(output_folder): os.makedirs(output_folder) for file in os.listdir(excel_folder): if file.lower().endswith(('.xlsx', '.xls')): excel_path = os.path.join(excel_folder, file) data = read_excel_data(excel_path) for idx, record in enumerate(data): output_name = f"{os.path.splitext(file)[0]}_{idx+1}.docx" output_path = os.path.join(output_folder, output_name) replace_in_doc(template_path, output_path, record) print(f"生成文件:{output_path}") # 使用示例 process_files( excel_folder="excel_files", template_path="template.docx", output_folder="output_docs" ) ``` 代码解释: 1. `read_excel_data`函数使用openpyxl读取Excel文件,将第一行作为表头,后续行转换为字典列表 2. `replace_in_doc`函数使用python-docx处理Word文档,替换所有段落和表格中的{{key}}格式占位符 3. `process_files`函数遍历指定文件夹下的所有Excel文件,为每个数据记录生成对应的Word文档 4. 生成的文件命名格式为:原Excel文件名_序号.docx 注意事项: 1. Word模板中需要使用双大括号包裹的占位符,例如:{{姓名}} 2. Excel文件第一行必须包含字段名称,且与Word模板中的占位符名称一致 3. 支持.xlsx和.xls格式的Excel文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值