python批量根据excel表行列信息更改txt文本文件

#求助#python批量根据excel表行列信息更改txt文本文件#
已有条件为:位于(D:\测试\测试原始副本)目录下有名为 输入命令的txt文本(输入命令.txt)
以及位于D:目录下的"参数序列.xlsx"的表格,主要内容如下所示:

img

需要完成以下操作,批量复制“测试原始副本”文件夹到目录(D:\新测试)下,并以N+excel表中第一列“编号”的数字重新命名,具体如N1,N2,...,N20,N21
然后修改复制过来对应文件夹中的(输入命令.txt)文件,这里希望可以封装为一个函数(只是修改txt的部分)。
修改的内容为:
将11行第1项修改为“T1A”列的数值×1000(以科学计数法表示),第2项内容修改为“T1B”列的数值
将14行第1项修改为“T2A”列的数值×1000(以科学计数法表示),第2项内容修改为“T2B”列的数值
将17行第1项修改为“T3A”列的数值×1000(以科学计数法表示),第2项内容修改为“T3B”列的数值
将21行第1项修改为“T4A”列的数值×1000(以科学计数法表示),第2项内容修改为“T4B”列的数值
划重点,!!替换的是第几第几项,而非这一整行,当前这四行均为8项(但txt文本里并不都是),替换位置如图所示

img

其中用于修改的数值必须与excel最前面的编号对应,如N1文件夹下的txt修改,N1里用来替换的值为:T1A(15),T1B(16),..,T4A(10),T4B(15),即N1右边的这一行数字,txt文本里对应黄色背景位置的值被括号里的数值替换,其他的以此用表格类推(excel一行一行往下)。

你可以把excel 文件给我 , 我写个demo给你

下面是Python实现批量操作的代码。

import os
import openpyxl

# 根据Excel表获取编号、T1A、T1B、T2A、T2B、T3A、T3B、T4A、T4B信息
def get_excel_info(excel_file):
    # 打开Excel文件
    wb = openpyxl.load_workbook(excel_file)
    sheet = wb.active
    
    info = {}
    
    # 遍历每一行获取信息
    for row in sheet.iter_rows(min_row=2, values_only=True):
        id = row[0]
        t1a = row[1] * 1000
        t1b = row[2]
        t2a = row[3] * 1000
        t2b = row[4]
        t3a = row[5] * 1000
        t3b = row[6]
        t4a = row[7] * 1000
        t4b = row[8]
        
        info[id] = {
            't1a': t1a,
            't1b': t1b,
            't2a': t2a,
            't2b': t2b,
            't3a': t3a,
            't3b': t3b,
            't4a': t4a,
            't4b': t4b,
        }
    
    return info

# 根据指定目录下的Excel文件获取编号和目录路径的映射关系
def get_dir_mapping(excel_file, dir_path):
    wb = openpyxl.load_workbook(excel_file)
    sheet = wb.active
    
    dir_mapping = {}
    
    for row in sheet.iter_rows(min_row=2, values_only=True):
        id = row[0]
        dir_name = os.path.join(dir_path, "N" + str(id))
        dir_mapping[id] = dir_name
        
        # 复制文件夹
        if not os.path.exists(dir_name):
            shutil.copytree(os.path.join(dir_path, "测试原始副本"), dir_name)
            
    return dir_mapping
        
# 修改文件夹中对应输入命令.txt的内容
def modify_txt_files(excel_file, dir_path):
    dir_mapping = get_dir_mapping(excel_file, dir_path)
    excel_info = get_excel_info(excel_file)
    
    for id, dir_name in dir_mapping.items():
        # 文件路径
        txt_file = os.path.join(dir_name, "输入命令.txt")
        
        # 打开文件并逐行读取
        with open(txt_file, "r") as f:
            lines = f.readlines()
        
        # 修改11行
        t1a = excel_info[id]['t1a']
        t1a_str = "{:.2E}".format(t1a)
        lines[10] = f"T1A {t1a_str}\n"
        
        t1b = excel_info[id]['t1b']
        lines[14] = f"T1B {t1b}\n"
        
        t2a = excel_info[id]['t2a']
        t2a_str = "{:.2E}".format(t2a)
        lines[17] = f"T2A {t2a_str}\n"
        
        t2b = excel_info[id]['t2b']
        lines[20] = f"T2B {t2b}\n"
        
        t3a = excel_info[id]['t3a']
        t3a_str = "{:.2E}".format(t3a)
        lines[23] = f"T3A {t3a_str}\n"
        
        t3b = excel_info[id]['t3b']
        lines[26] = f"T3B {t3b}\n"
        
        t4a = excel_info[id]['t4a']
        t4a_str = "{:.2E}".format(t4a)
        lines[30] = f"T4A {t4a_str}\n"
        
        t4b = excel_info[id]['t4b']
        lines[33] = f"T4B {t4b}\n"
        
        # 写入文件
        with open(txt_file, "w") as f:
            f.writelines(lines)

if __name__ == "__main__":
    excel_file = "/path/to/excel/file.xlsx"
    dir_path = "D:/新测试"
    modify_txt_files(excel_file, dir_path)

import os
import pandas as pd

def modify_txt_files(input_file, param_file, src_dir, dest_dir):
    # 读取参数序列.xlsx,获取编号列和需要修改的列(T1A、T1B、T2A、T2B、T3A、T3B、T4A、T4B)
    df = pd.read_excel(param_file)
    num_col = df.columns[0]
    modify_cols = df.columns[1:]

    # 遍历输入命令.txt文件
    with open(input_file, 'r') as f:
        input_text = f.readlines()
    
    # 遍历测试原始副本目录下的每个文件夹,将其复制到新测试目录下并以N+编号命名
    for root, dirs, files in os.walk(src_dir):
        for dir_name in dirs:
            src_path = os.path.join(root, dir_name)
            dest_name = 'N' + str(df.loc[df[num_col]==dir_name][num_col].index[0]+1)
            dest_path = os.path.join(dest_dir, dest_name)
            os.makedirs(dest_path)

            # 遍历文件夹内的输入命令.txt文件,读取其中的内容并进行替换
            for file_name in files:
                if file_name == '输入命令.txt':
                    src_file = os.path.join(src_path, file_name)
                    dest_file = os.path.join(dest_path, file_name)
                    with open(src_file, 'r') as f:
                        text = f.readlines()

                    # 根据编号获取需要修改的参数值
                    params = df.loc[df[num_col]==dir_name][modify_cols].values[0]

                    # 修改txt文件中的内容
                    text[10] = f"T1A: {params[0]*1000:e}\n"
                    text[11] = f"T1B: {params[1]:.2f}\n"
                    text[13] = f"T2A: {params[2]*1000:e}\n"
                    text[14] = f"T2B: {params[3]:.2f}\n"
                    text[16] = f"T3A: {params[4]*1000:e}\n"
                    text[17] = f"T3B: {params[5]:.2f}\n"
                    text[20] = f"T4A: {params[6]*1000:e}\n"
                    text[21] = f"T4B: {params[7]:.2f}\n"

                    with open(dest_file, 'w') as f:
                        f.writelines(text)

具体思路为
第1行:引入需要用到的库os和pandas。
第3-12行:定义一个函数modify_txt_files,该函数有四个参数:输入命令.txt文件名、参数序列.xlsx文件名、测试原始副本目录名和新测试目录名。该函数用于批量修改txt文件。其中,num_col表示参数序列.xlsx中的编号列(第一列),modify_cols表示需要修改的列(T1A、T1B、T2A、T2B、T3A、T3B、T4A、T4B)。
第15行:使用pandas库的read_excel方法读取参数序列.xlsx文件,获取编号列和需要修改的列。
第18-20行:打开输入命令.txt文件,读取其中的内容。
第23-38行:遍历测试原始副本目录下的每个文件夹。对于每个文件夹,获取其编号,并将其复制到新测试目录下并以N+编号命名。在遍历过程中,使用os.walk方法来遍历目录下的所有子目录和文件。
第27行:根据编号(dir_name)获取需要修改的参数值(params),即T1A、T1B、T2A、T2B、T3A、T3B、T4A、T4B。
第30-45行:遍历文件夹内的输入命令.txt文件,读取其中的内容并进行替换。在遍历过程中,用os.path.join

可以参考下

import pandas as pd
import openpyxl
import time
import os
#输入路径
inpath = 'D:/Data'
#输出路径
outpath = 'D:/Data'
 
print ('START:'+ str(time.ctime()))
 
#读取excel文件
for afile in os.listdir(inpath):
  if afile[-4:].lower() == 'xlsx':
    print(afile)
    name = inpath+'/'+afile
    #读取每一个sheet
    wb = openpyxl.load_workbook(name)
    sheets = wb.sheetnames
    for sheet in sheets:
      print(sheet)
      df = pd.read_excel(name, sheet_name=sheet, header=None)
      print('开始写入txt文件...')
      #保存txt文件
      df.to_csv(outpath+'/'+afile[:-5]+'_'+sheet+'.txt', header=None, sep=',', index=False)
      print('文件写入成功!')
    
print ('END:' + str(time.ctime()))