python读取一个excel数据并写入指定文件夹下的文件中


 

# 20240626d Made by ryu  
# 测试 固定几个数值写入文件中
# OK read_input() 读取xlsx文件内容 写入指定文件夹下指定位置
# OK 从 maillist.txt 中读取邮件列表
# 240628

import os
import pandas as pd
import time
from openpyxl import load_workbook
import sys
import csv

# 初始化一个空的列表来存储数据字典
data_dicts = []

os.chdir(os.path.dirname(__file__))

g_mail_file = 'maillist.csv'
g_input_book = 'DW,Sales target planning sheet Ver2.2_一覧_20240612c_test.xlsx'
g_input_sheet_name = 'test1'
g_output_sheet_name = 'Target sheet'
g_folder_path = r'C:\Liu\NPCJ\SPD\個人目標設定集計\output_test'  # 替换为你的Excel文件夹路径
g_input_filename = 'DW,Sales target planning sheet Ver2.41_KIM_外.xlsx'
# $构造output文件夹下文件的完整路径
g_output_file_path = os.path.join(g_folder_path, f"{g_input_filename}")

start_time = time.time()

# 读取input_book 中所有sheet的名字
xl = pd.ExcelFile(g_input_book)
sheets = xl.sheet_names
for sheet in sheets:
    print(sheet)

# # 读取sheet名为 input_sheet_name 的所有数据变为 DataFrame
# g_df = pd.read_excel( g_input_book, sheet_name=g_input_sheet_name)

g_target_mail = 'shibahara.takeshi@nidec.com'
g_list_filename_path = []

# # $ 读取maillist.txt 作为g_target_mail 开始
# with open(g_mail_file, 'r', encoding='utf-8') as file:
#     g_mail_list = [line.strip() for line in file if line.strip()]
# print(g_mail_list)

# OK$ 使用pandas读取Excel文件中的指定sheet的部分数据 跳过14行 读取15行~50行的50-15+1行 
g_df_part = pd.read_excel(g_input_book, sheet_name=g_input_sheet_name, header=None, usecols='B:AY', nrows=50-15+1, skiprows=14)
print(g_df_part)
    

# $OK 读取整个文件夹内的文件名 并连接好路径 存在列表中
def read_folder():
    global g_list_filename_path
    file_path_list = [] 
    list_filenames = os.listdir(g_folder_path)
    for filename in list_filenames:
        if filename.endswith('.xlsx') or filename.endswith('.xls'):
            file_path = os.path.join(g_folder_path, filename)
            file_path_list.append(file_path)
    g_list_filename_path = file_path_list
    print( g_list_filename_path)

read_folder()
    

# OK读取对应mail所对应的数据行并返回
# def read_excel0(target_mail):

#     # $查找B列中值为'shibahara.takeshi@nidec.com'的一行
#     matching_rows = g_df_part[g_df_part.iloc[:, 0] == target_mail]
#     print(matching_rows)
#     return matching_rows

# OK读取对应mail所对应的数据行并返回
def read_write_excel0(target_mail, output_file_path):

    # $查找B列中值为'shibahara.takeshi@nidec.com'的一行
    matching_rows = g_df_part[g_df_part.iloc[:, 0] == target_mail]
    print(matching_rows)
    
    read_write_excel1( matching_rows, target_mail, output_file_path)
    
    return matching_rows

# OK读取对应 target_mail 数据中 B15~AY50 的数据 《外売り/External Sale》
# 读取的数据写入对应的excel的sheet中对应的位置(写入到Excel文件的out表单的C7, D7, E7中)
def read_write_excel1(  matching_rows, target_mail, output_file_path ):
    
    # matching_rows = read_excel0( target_mail)

    # $假设我们找到了至少一行匹配的行,并且我们想要取这三列的值(23:25,因为iloc是基于0的索引)
    # 注意:如果matching_rows为空,这里会抛出异常
    if not matching_rows.empty:
        result1 = matching_rows.iloc[0, 23:26]  # 取第一行的23(Y), 24(Z), 25(AA)列的值
        result2 = matching_rows.iloc[0, 28:31]# 取第一行的29(AE), 30(AD), 31(AF)列的值
        print(result1)
        print(result2)

        # $写入到Excel文件的out表单的C7, D7, E7中
        with pd.ExcelWriter(output_file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:  # 'a'表示追加模式,'overlay'表示如果表单存在则覆盖
            # 可能需要先检查表单'Target sheet'是否存在,这里简化处理直接创建或覆盖
            output_sheet = writer.book.add_worksheet('Target sheet') if 'Target sheet' not in writer.sheets else writer.sheets['Target sheet']
            
            # $写入值到指定的单元格
            for col, value in enumerate(result1, start=2):  # col=2对应C列,因为Excel列是从1开始的
                output_sheet.cell(7, col+1, value)  # 6对应第7行,因为Excel行是从1开始的 C,D,E列需要用 col+1   
            for col, value in enumerate(result2, start=2):  # col=2对应C列,因为Excel列是从1开始的
                output_sheet.cell(8, col+1, value)  # 6对应第7行,因为Excel行是从1开始的 C,D,E列需要用 col+1  
    
    matching_rows.to_csv('matching_row.csv')
    dict =  {target_mail: result1}
    print(dict)
    
# 暂时不用
def write_output():
    
        # 构造output文件夹下文件的完整路径
    output_file_path = os.path.join(g_folder_path, f"{g_input_filename}")
    
    # 加载已存在的Excel文件或创建一个新的(如果不存在)
    try:
        wb = load_workbook(output_file_path)
        ws = wb[g_output_sheet_name]  # 指定要写入的工作表名
        # ws = wb.active 
    except FileNotFoundError:
        # 如果文件不存在,创建一个新的Excel文件并添加一个sheet
        wb = pd.ExcelWriter(output_file_path, engine='openpyxl')
        ws = wb.book.create_sheet('Sheet1')
        # 注意:此时ws不能直接用于写入数据,因为wb还未保存,所以我们在最后统一保存
        
    # 写入数据到F8和G8单元格
    # ws.cell(row=8, column=6, value=value_b)
    # ws.cell(row=8, column=7, value=value_c)

    # 如果创建了新的Excel文件,现在保存它
    if isinstance(wb, pd.ExcelWriter):
        # 因为我们还没有向工作簿中添加任何数据(除了工作表),所以不需要使用DataFrame.to_excel
        wb.save()
        wb.close()  # 关闭工作簿以释放资源
    else:
        # 如果文件已经存在,我们只需要保存更改
        wb.save(output_file_path)
        wb.close()  # 关闭工作簿以释放资源

# _______________________________________________________________________
# 源自gpt
# 首先读取CSV文件并将每一行数据(包含mail和name)存储在一个字典列表中。然后,我们遍历output文件夹下的每个文件名,并检查文件名是否包含CSV数据中的name字段和给定的字符串。如果找到匹配项,我们将其与相应的mail和name一起添加到matching_entries列表中。最后,我们返回这个列表。
def find_matching_files(csv_path, output_folder, str_to_check):
    # 读取CSV文件并构建一个字典列表,每个字典包含mail和name
    csv_data = []
    with open(csv_path, mode='r', encoding='utf-8') as csv_file:
        # g_mail_list = [line.strip() for line in file if line.strip()]
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            csv_data.append({'mail': row['mail'], 'name': row['name']})

    # 初始化一个列表来存储匹配的文件名和对应的mail、name
    matching_entries = []

    # 遍历output文件夹下的所有文件
    for filename in g_list_filename_path:
    # for filename in os.listdir(output_folder):
        # 检查文件名是否包含CSV中的name和一个给定的字符串
        for entry in csv_data:
            if entry['name'] in filename and str_to_check in filename:
                matching_entries.append({
                    'mail': entry['mail'],
                    'name': entry['name'],
                    'filename': filename
                })
                break  # 如果找到匹配项,则跳过当前文件名的其他name检查

    return matching_entries


if __name__ == '__main__':
    config0 = sys.argv[0]
    
    str1 = "外"
    # read_folder()
    dict = find_matching_files(g_mail_file, g_folder_path, str1)
    
    for record in dict:
        print(record)
        read_write_excel0(record['mail'], record['filename'])
        
    end_time = time.time()
    run_time = end_time - start_time
    print(f'runtime: {run_time}')

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你可以使用 Python 的 pandas 库来读取同一文件夹下的多个 Excel 文件,并从提取需要的数据,然后将这些数据写入一个新的 Excel 文件。下面是一个示例代码: ```python import os import pandas as pd # 设置文件夹路径 folder_path = '/path/to/folder' # 获取文件夹所有的 Excel 文件 excel_files = [f for f in os.listdir(folder_path) if f.endswith('.xlsx')] # 创建一个空的 DataFrame 用于存储所有数据 data = pd.DataFrame() # 循环遍历每个 Excel 文件,提取需要的数据 for file in excel_files: file_path = os.path.join(folder_path, file) df = pd.read_excel(file_path, sheet_name='Sheet1') # 提取第一列和第三列的数据,并将它们合并到 data DataFrame data = pd.concat([data, df.iloc[:, [0, 2]]], axis=0) # 将 data 数据写入一个新的 Excel 文件 output_file = '/path/to/output.xlsx' data.to_excel(output_file, index=False) ``` 在这个示例代码,我们首先设置了文件夹路径并获取了所有的 Excel 文件。接下来,我们循环遍历每个 Excel 文件,使用 pandas 库的 read_excel() 函数读取每个文件数据。在这个示例,我们假设数据位于每个 Excel 文件的第一张工作表 (Sheet1) ,并且我们需要提取每个文件的第一列和第三列的数据。我们使用 iloc 属性来选择需要的列,并将它们合并到一个名为 data 的 DataFrame 。最后,我们将 data 数据写入一个新的 Excel 文件,这个文件路径是 '/path/to/output.xlsx'。 注意,在这个示例,我们使用了 concat() 函数将每个 Excel 文件提取的数据合并到一个 DataFrame 。在实际应用,你可能需要根据数据的特点来选择合适的合并方法,例如使用 merge() 函数或 join() 函数。此外,在写入新的 Excel 文件时,你可以使用 to_excel() 函数来指定需要写入的工作表名称,例如 data.to_excel(output_file, sheet_name='Sheet1')。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hkmaike

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值