python编程练习——读取指定目录下所有文件及其大小,并且将读到的文件名和大小写进excel表中

本文介绍了一种方法,用于读取指定文件夹下所有文件的名称和大小,并将这些信息写入Excel表格。通过Python的os和xlwt库,实现了文件信息的读取和Excel的创建与写入。

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

需求说明:读取电脑指定文件夹下所有文件的文件名及其大小(暂时未考虑目录下有文件夹的情况),并且将读到的文件名及其大小写进excel表中

excel表相关操作

将excel相关操作单独写了一个模块,放在operate_excel.py中,包括功能:创建excel同时添加一个sheet,写入数据

"""
__title__  : operate_excel
__time__   : 2019/3/4 16:06
"""

import xlrd
import xlwt
from xlutils.copy import copy
import time
import os

class OperateExcel(object):

    def make_workbook(self, sheetname=None,filename=None, filedir=None):
        '''
        新建一个excel,并且在该excel中添加一个sheet
        :param sheetname: 表名
        :param filename: excel文件名
        :param filedir: 该excel所在路径
        :return: 返回excel所在绝对路径,包括文件名,如:D:\F\pyworkspace\lala.xls
        '''
        if filename == None:
            filename = str(self.get_time())
        if filedir == None:
            filedir = os.getcwd()
        if sheetname == None:
            sheetname = str(self.get_time())
        fileabs = filedir + '\\' + filename + '.xls'
        workbook = xlwt.Workbook(encoding='UTF-8')
        workbook.add_sheet(sheetname)
        workbook.save(fileabs)
        return fileabs

    def get_time(self):
        '''
        获取当前时间,取文件名时使用
        :return: 返回格式化的时间 如“20190304140634”
        '''
        date = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
        return date

    def write_excel(self,fileabs, data):
        '''
        打开现有excel,按照一定格式写入传入的数据
        :param fileabs: excel文档所在绝对路径,如:D:\F\pyworkspace\lala.xls
        :param data: 传入的数据,list,格式如[[1,2,3],['a','c','c']]
        :return: 无
        '''
        f=xlrd.open_workbook(fileabs)
        fcopy = copy(f)
        sheetcopy = fcopy.get_sheet(0)

        rows = len(data)  # 行数
        for i in range(rows):
            sheetcopy.write(i, 0, i)
            for j in range(len(data[i])):  # len(data[i]) 列数
                sheetcopy.write(i, j + 1, data[i][j])
        fcopy.save(fileabs)
读文件&写入excel
import os
from operate_excel import OperateExcel

class ReadFile(object):

    def read_file(self,dir):
        '''
        读取指定目录下的文件,及其大小
        :param dir: 要读取的目录
        :return: 返回嵌套列表,存储文件名及其大小,如[['文件A','10KB'],['文件B','16KB']]
        '''
        file_list = os.listdir(dir)
        new_list = []
        for i in range(len(file_list)):
            file_absdir = dir + '\\' + file_list[i]
            file_size = str(int(os.path.getsize(file_absdir)/1024)) + 'KB'
            new_list.append([file_list[i],file_size])
        return new_list

if __name__ == "__main__":
    dir = 'D:\G-文档\Markdown文档'
    read_file = ReadFile()
    data_list = read_file.read_file(dir)
    oe = OperateExcel()
    excel_dir = oe.make_workbook(filedir="d:\\")
    oe.write_excel(excel_dir,data_list)
输出excel效果

在这里插入图片描述
(小声哔哔,关于写文档,语言组织能力还是有待提高~)

<think>好的,我现在需要帮用户写一段Python代码,使用pandas读取指定文件夹内的所有Excel文件及其所有sheet,并自动生成变量名。首先,我得回想一下pandas处理Excel的相关函数,应该是用pd.read_excel,但如何遍历所有文件每个文件的sheet呢? 用户提到的是读取所有Excel文件,所以可能需要用到os模块来遍历文件夹。比如,用os.listdir或者glob库来获取所有.xlsx或.xls的文件。然后对于每个文件,需要读取所有sheet。因为一个Excel文件可能有多个sheet,所以得用sheet_name=None参数来读取所有sheet,返回一个字典,键是sheet名,值是数据框。 接下来,自动生成变量名。这部分可能需要根据文件名sheet名来组合变量名。比如,假设文件名是data1.xlsx,sheet名是Sheet1,那么变量名可能是data1_Sheet1_df。但变量名中不能有特殊字符,比如空格或连字符,所以需要处理一下,比如用下划线替换空格或其他符号。 然后,可能需要将这些数据框存储到一个字典里,方便后续访问。或者动态地将变量名添加到全局变量中,但这样可能不太安全或者难以维护。所以可能更合适的是用字典来保存所有的数据框,键是生成的变量名,值是对应的数据框。 不过用户的要求是“自动产生变量名”,所以可能需要动态地将这些变量名创建到当前作用域中,比如使用globals()函数。但这样做可能会有风险,特别是如果文件名或sheet名有奇怪的字符的话。或者用户可能只是希望生成变量名的字符串,而不是实际创建变量。需要一步考虑用户的实际需求。 可能用户是想将这些数据框作为变量直接使用,比如在代码里直接用data1_Sheet1_df这样的变量名。这样的话,需要用exec或者类似的方法动态创建变量。但这种方法通常不推荐,因为容易引发问题,比如覆盖已有的变量,或者安全问题。但如果是用户明确需要的话,可能需要这样做。 所以,整个流程大概是: 1. 使用glob或os遍历指定文件夹下的所有Excel文件。 2. 对于每个Excel文件,使用pd.read_excel读取所有sheet。 3. 对每个sheet的数据,生成一个变量名,比如将文件名sheet名组合,并处理成合法的变量名。 4. 将这些数据框存储到字典中,或者动态创建变量。 现在需要考虑如何处理文件名sheet名中的非法字符,比如空格、点、横杠等。比如,用下划线替换这些字符。例如,文件名是"sales-data 2023.xlsx",sheet名是"Jan Data",那么变量名可能是sales_data_2023_Jan_Data_df。 那具体实现的话,可以用正则达式替换非字母数字字符为下划线。或者用字符串的replace方法,把空格替换成下划线,去掉扩展名等等。 另外,可能会有文件名重复的情况,或者不同文件的sheet名相同的情况,这时候变量名会冲突,所以需要确保变量名的唯一性。比如,结合文件名sheet名来生成唯一的变量名。 接下来,具体步骤: 步骤一:导必要的库,pandas,os,glob,可能还需要import re来处理正则达式。 步骤二:指定文件夹路径,比如folder_path = './excel_files/',需要用户输或硬编码? 步骤三:遍历文件夹中的Excel文件,可以使用glob.glob(folder_path + '*.xlsx').xls的情况,或者使用os.listdir然后筛选后缀。 步骤四:对于每个Excel文件读取所有sheet。用pd.read_excel(file_path, sheet_name=None),这会返回一个字典,键是sheet名,值是数据框。 步骤五:遍历每个sheet的数据框,生成变量名。例如,filename = os.path.splitext(os.path.basename(file_path))[0],然后处理filename中的非法字符,同理处理sheet名,组合起来形成变量名,如var_name = f"{clean_filename}_{clean_sheetname}_df"。 步骤六:将变量名数据框存储到字典中,或者动态创建变量。 关于步骤六,用户可能需要将数据框保存为变量,以便后续使用。但更安全的方式是存储到字典里,比如all_dfs = {},然后all_dfs[var_name] = df。或者使用exec语句动态创建变量,如exec(f"{var_name} = df")。但需要注意,如果文件名或sheet名中有奇怪的字符,可能会导致变量名不合法,所以必须确保var_name是有效的Python变量名。 因此,处理非法字符是关键。例如,可以使用正则达式将非字母数字的字符替换为下划线,并去除开头的数字。 例如,定义一个函数来清理名称: def clean_var_name(name): # 替换非字母数字字符为下划线 cleaned = re.sub(r'[^a-zA-Z0-9]', '_', name) # 去除开头的数字,如果存在的话 if cleaned and cleaned[0].isdigit(): cleaned = '_' + cleaned return cleaned 然后,对于文件名sheet名,都应用这个函数。 例如,filename是"2023_sales data.xlsx",处理后变成"_2023_sales_data",然后sheet名是"Jan-Data",处理后变成"Jan_Data",所以变量名为_2023_sales_data_Jan_Data_df。 这样处理后的变量名就是合法的了。 现在,将这些步骤整合到代码中。 可能的代码结构: import pandas as pd import os import glob import re def clean_var_name(name): cleaned = re.sub(r'[^a-zA-Z0-9]', '_', name) if len(cleaned) > 0 and cleaned[0].isdigit(): cleaned = '_' + cleaned return cleaned folder_path = 'path/to/excel_folder/' all_excel_files = glob.glob(os.path.join(folder_path, '*.xlsx')) + glob.glob(os.path.join(folder_path, '*.xls')) dfs_dict = {} for file_path in all_excel_files: file_name = os.path.splitext(os.path.basename(file_path))[0] clean_file = clean_var_name(file_name) # 读取所有sheet sheets = pd.read_excel(file_path, sheet_name=None) for sheet_name, df in sheets.items(): clean_sheet = clean_var_name(sheet_name) var_name = f"{clean_file}_{clean_sheet}_df" # 存储到字典 dfs_dict[var_name] = df # 或者动态创建变量 # exec(f"{var_name} = df") # 但建议用字典更安全 # 或者如果用户确实需要变量,可以使用globals().update(dfs_dict),但可能会有风险 print("生成的变量名列:", list(dfs_dict.keys())) 这样,用户可以通过dfs_dict['var_name']来访问对应的数据框,或者如果使用exec的话,可以直接用变量名,但需要谨慎。 可能用户的需求是生成变量名,并存储数据框,所以使用字典是比较好的方式。或者用户可能希望代码输出这些变量名,并允许后续使用。比如,用户可能想将这些数据框作为独立变量来处理,但这样动态创建变量可能不太推荐,但在某些情况下可以接受。 综上,代码的大致思路是这样的。需要注意处理文件名sheet名的非法字符,确保变量名合法。同时,要处理可能重复的情况,但代码中并没有处理重复的var_name的情况,比如同一个文件名不同大小写的情况,或者不同的文件有相同的文件名sheet名,这时候可能需要一步处理,比如添加序号。但用户的问题中没有提到这点,所以可能暂时不考虑,或者提示用户可能存在覆盖的情况。 另外,测试的时候需要考虑不同情况,比如文件名中有空格、特殊符号,sheet名中有类似的问题,确保生成的变量名合法。 最后,给用户的代码可能需要包含这些部分,并注释说明。同时提醒用户如果需要动态创建变量,可以使用exec,但需要注意潜在问题,建议使用字典。</think>以下是一段Python代码,用于读取指定文件夹内的所有Excel文件及其所有Sheet,并自动生成规范的变量名(存储为字典键): ```python import pandas as pd import os import re from pathlib import Path def clean_var_name(name): """清理非法字符生成有效变量名""" # 替换非字母数字字符为下划线 name = re.sub(r'[^a-zA-Z0-9]', '_', name) # 确保不以数字开头 if re.match(r'^\d', name): name = '_' + name return name.lower() # 统一小写(可选) def read_all_excel_sheets(folder_path): """读取文件夹内所有Excel文件及其Sheet""" all_data = {} # 遍历所有Excel文件 for file_path in Path(folder_path).glob('*.xls*'): try: # 获取干净的文件名 file_name = clean_var_name(file_path.stem) # 读取所有Sheet sheets = pd.read_excel(file_path, sheet_name=None) # 遍历每个Sheet for sheet_name, df in sheets.items(): # 生成组合变量名 var_name = f"{file_name}_{clean_var_name(sheet_name)}" # 处理重复名称 counter = 1 original_name = var_name while var_name in all_data: var_name = f"{original_name}_{counter}" counter += 1 # 存字典 all_data[var_name] = df except Exception as e: print(f"Error processing {file_path}: {str(e)}") return all_data # 使用示例 if __name__ == "__main__": folder_path = "./excel_files" # 替换为你的文件夹路径 data_dict = read_all_excel_sheets(folder_path) # 查看生成的变量名 print("生成的变量名列:") for var_name in data_dict.keys(): print(f"- {var_name}") # 访问数据示例 # sample_df = data_dict['example_file_sheet1'] ``` ### 代码特点: 1. **自动处理非法字符**:将文件名Sheet名中的特殊字符转换为下划线 2. **防止数字开头**:自动添加前缀下划线处理以数字开头的情况 3. **防止重复名称**:自动为重复名称添加序号后缀 4. **异常处理**:捕获并提示读取错误文件 5. **统一存储**:使用字典存储所有DataFrame,键为生成的变量名 ### 使用说明: 1. 修改`folder_path`变量为你的Excel文件所在路径 2. 通过`data_dict['变量名']`访问具体数据 3. 生成的变量名格式:`[清理后的文件名]_[清理后的Sheet名]` ### 注意事项: - 支持.xls.xlsx格式文件 - 文件名Sheet名中的中文会被保留(自动转换为下划线) - 如果出现重复的变量名,会自动添加数字后缀 - 建议使用字典访问方式而非直接创建变量,更安全可靠 如果需要直接创建独立变量(需谨慎),可在循环内添加: ```python globals()[var_name] = df ``` 但这种方式可能存在覆盖风险,不建议在生产环境中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值