#求助#python批量根据excel表行列信息更改txt文本文件#
已有条件为:位于(D:\测试\测试原始副本)目录下有名为 输入命令的txt文本(输入命令.txt)
以及位于D:目录下的"参数序列.xlsx"的表格,主要内容如下所示:
需要完成以下操作,批量复制“测试原始副本”文件夹到目录(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文本里并不都是),替换位置如图所示
其中用于修改的数值必须与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()))