使用python判断同名文件

该博客介绍了一个使用Python实现的功能,能够扫描指定目录`base_dir`下所有文件,寻找同名但不同后缀的文件对,并将它们移动到目标文件夹`aim_dir`。此功能适用于文件完整性检查,如电影与字幕匹配。程序首先创建目标文件夹(如果不存在),然后遍历所有文件,通过比较文件名与后缀,将没有对应后缀的文件移动到目标文件夹。目标后缀名和要匹配的后缀名可以自定义。在运行过程中,如果遇到重名文件,程序会提示。

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

使用pythnon判断是否有同名但不同后缀名文件

功能

可以对base_dir下的所有文件进行扫描,并将没有重名的文件转移。
可用于电影,字幕匹配,检查文件对完整性等。

例如:若文件夹内分别有:

  • base_dir
    • dir1
      • img1.jpg
      • img2.jpg
      • img1.json
    • dir2
      • img3.jpg
      • img4.jpg
      • img5.jpg
      • img3.json
    • img6.jpg
    • img7.jpg
    • img4.json

则在运行后会将img1,img3,img4对应的图片移动到目标文件夹。
其中目标后缀名(例中的.jpg和.json)可以自定义。

实现

import os  # 用来读取文件
import shutil  # 用来移动文件

base_dir = r'F:\pytest\testDir'  # 照片根目录,会自动递归扫描
aim_dir = r'F:\pytest\testDir\out'  # 目标文件夹,若没有此文件夹会自动创建
suffix = '.png'  # 目标文件后缀名
suffix1 = '.json'  # 重合文件后缀名

if not os.path.exists(aim_dir):  # 新建文件夹
    os.mkdir(aim_dir)

# 读取base_dir下的所有文件
ff = []
for path, direction, files in os.walk(base_dir):
    for file in files:
        if path != aim_dir:
            ff.append(os.path.join(path, file))

# 将文件名与拓展名切分,保存文件名
fd = [f.split('\\')[-1] for f in ff]

# 想输出就把下面注释取消
# for i in ff:
#     if i.endswith(suffix):  # 如果后缀是jpg
#         print(os.path.abspath(i))

for each in ff:
    if each.endswith(suffix):  # 如果是以suffix结尾
        if not os.path.splitext(each)[0].split('\\')[-1] + suffix1 in fd:  # 如果没有对应名称的suffix1
            try:
                shutil.move(each, aim_dir)
            except shutil.Error:  # 如果多个子文件夹内有相同名称的文件
                print('有重名文件' + each)

<think>我们被要求将xls文件转换为xlsx格式,并且使用Python实现根据提供的引用,有两种方法可以实现: 方法1(引用[1]):使用pandas库,通过pd.read_excel读取xls文件,然后使用to_excel方法保存为xlsx格式。 方法2(引用[2]):使用win32com库,通过Excel应用程序打开xls文件,然后另存为xlsx格式。 两种方法的比较: 方法1(pandas): - 优点:跨平台(Windows、Mac、Linux),不需要安装Microsoft Excel。 - 缺点:可能无法处理一些复杂的xls文件(如包含宏、图表等),且转换过程中可能会丢失一些格式。 方法2(win32com): - 优点:利用本地安装的Excel应用程序,转换效果更好,能保留更多格式(如宏、图表等)。 - 缺点:只能在Windows系统上运行,且需要安装Microsoft Excel。 根据用户需求,如果只是简单的数据转换,且希望跨平台,推荐使用pandas方法。如果需要保留复杂格式,并且运行环境是Windows且有安装Excel,则可以使用win32com方法。 下面分别提供两种方法的代码示例: 方法1:使用pandas 步骤: 1. 安装pandas和openpyxl(openpyxl用于写入xlsx文件,pandas读取xls需要xlrd,但注意xlrd>=2.0只支持xlsx,所以对于xls文件,我们需要使用xlrd<2.0或者使用openpyxl?实际上,pandas读取xls文件需要xlrd库,且xlrd1.2.0之后不再支持xlsx,而xlrd>=2.0只支持xls?这里需要注意:pandas读取xls文件需要xlrd库,且xlrd库的最新版本已经不支持xlsx,但支持xls。所以我们需要安装xlrd(版本不限,但建议最新版本,因为最新版本支持xls)和openpyxl(用于写xlsx))。 但是注意:pandas在读取xls文件时,使用`pd.read_excel`默认使用xlrd引擎,而xlrd最新版本(2.0.1)已经移除了对xls的支持?实际上,xlrd从2.0.0版本开始不再支持xls以外的任何格式,并且2.0.0版本之前是支持xls的。所以我们需要确保安装的是xlrd<2.0.0或者使用其他引擎?但是pandas文档中说明,对于xls文件,可以使用`engine='xlrd'`(默认)来读取,而xlrd1.2.0版本可以读取xls。所以我们需要安装xlrd==1.2.0? 实际上,pandas1.2.0以后,默认使用openpyxl来处理xlsx文件,而xlrd用于处理xls文件。但是xlrd2.0.0版本不再支持xls?所以为了避免问题,我们可以安装xlrd==1.2.0,或者使用openpyxl来读取xls?注意:openpyxl不支持读取xls。所以读取xls只能用xlrd(旧版)或者pyxlsb(用于xlsb)等。 因此,我们建议安装: pandas openpyxl xlrd==1.2.0 # 确保可以读取xls文件 2. 遍历文件夹中的xls文件,逐个读取并保存为xlsx。 方法2:使用win32com 步骤: 1. 安装pywin32:pip install pywin32 2. 使用win32com.client调度Excel应用程序,打开xls文件,然后另存为xlsx格式(FileFormat=51),最后关闭Excel。 根据用户的需求,我们提供两个版本的代码。 考虑到用户可能更倾向于简单且跨平台的方法,我们首先提供pandas方法。但是请注意,如果xls文件很大或者很复杂,pandas方法可能无法完美转换。如果用户需要更精确的转换,再考虑win32com方法。 下面我们分别编写两个方法的代码: 方法1:使用pandas 注意:需要安装pandas, openpyxl, xlrd(版本1.2.0) 代码结构: 1. 输入文件夹路径 2. 切换到该文件夹 3. 获取所有xls文件(注意:可能包含.xls和.XLS,我们只处理后缀为.xls的文件,注意大小写?) 4. 循环处理每个文件:读取xls文件,然后保存为xlsx文件同名,但后缀改为.xlsx),并删除原xls文件?注意:原引用中没有删除原文件,用户可能需要保留原文件。所以我们可以选择保留原文件,也可以选择删除。这里我们默认保留原文件,即生成xlsx文件后,原xls文件仍然存在。如果需要删除,可以在转换后添加删除代码。 但是注意:用户可能希望覆盖原文件?或者生成新文件。我们这里采用生成新文件(后缀改为xlsx),原文件保留。 方法2:使用win32com 同样,我们保留原文件,生成新文件(后缀为.xlsx),如果需要删除原文件,可以添加删除代码。 我们先写pandas方法,因为跨平台。 注意:如果文件夹中既有xls也有xlsx,我们只处理xls。 考虑到用户输入路径,我们可以使用绝对路径或相对路径。这里我们使用绝对路径,避免路径错误。 另外,我们还需要考虑文件名的大小写问题,比如有些文件可能是大写的.XLS,我们可以通过扩展名的小写判断。 编写代码: 方法1:pandas 步骤: 1. 安装必要的库(如果用户没有安装,需要提示安装,但代码中不包含安装过程,用户需自行安装) 2. 获取用户输入的文件夹路径 3. 遍历文件夹中所有文件,对扩展名为.xls(不区分大小写)的文件进行处理 4. 读取xls文件,然后保存为同名的xlsx文件(注意:如果文件已经存在,则覆盖?) 注意:pandas读取xls文件时,可能会遇到一些格式问题,所以最好捕获异常。 方法2:win32com 步骤类似,但需要确保在Windows环境下运行,并且安装了Excel。 由于用户没有明确要求,我们提供两种方法供选择。 但是,用户的问题只是“请问使用Python将xls文件转换为xlsx格式”,所以我们先给出一个通用的方法(pandas),再给出一个备选方法(win32com)。 下面我们分别给出代码示例: 方法1:使用pandas 注意:我们假设原文件名为“example.xls”,转换为“example.xlsx”,保存在同一目录。 代码: import os import pandas as pd # 设置文件夹路径 folder_path = input("请输入包含xls文件文件夹路径: ").strip() # 切换到该文件夹 os.chdir(folder_path) # 获取所有文件 files = os.listdir() # 筛选出扩展名为.xls(不区分大小写)的文件 xls_files = [f for f in files if f.lower().endswith('.xls')] # 循环处理 for i, xls_file in enumerate(xls_files): print(f"正在转换第{i+1}个文件: {xls_file}") try: # 读取xls文件 df = pd.read_excel(xls_file, engine='xlrd') # 明确指定引擎,确保使用xlrd # 构建新的文件名 xlsx_file = os.path.splitext(xls_file)[0] + '.xlsx' # 保存为xlsx df.to_excel(xlsx_file, index=False, engine='openpyxl') except Exception as e: print(f"转换失败: {xls_file}, 错误信息: {e}") print("转换完成") 注意:这里我们明确指定了读取引擎为xlrd,写入引擎为openpyxl。但是,在pandas中,写入xlsx文件默认使用openpyxl(如果安装了openpyxl),所以也可以不指定engine='openpyxl'。 但是,如果遇到问题,可能需要安装xlrd和openpyxl。 方法2:使用win32com 代码: import os import win32com.client as win32 folder_path = input("请输入包含xls文件文件夹路径: ").strip() os.chdir(folder_path) files = os.listdir() xls_files = [f for f in files if f.lower().endswith('.xls')] excel = win32.gencache.EnsureDispatch('Excel.Application') # 设置Excel不可见 excel.Visible = False for i, xls_file in enumerate(xls_files): print(f"正在转换第{i+1}个文件: {xls_file}") try: # 构建完整路径 full_path = os.path.abspath(xls_file) # 打开工作簿 wb = excel.Workbooks.Open(full_path) # 新文件名:将扩展名改为.xlsx new_file = os.path.splitext(full_path)[0] + '.xlsx' # 保存为xlsx格式 wb.SaveAs(new_file, FileFormat=51) # 51 表示xlsx格式 wb.Close() except Exception as e: print(f"转换失败: {xls_file}, 错误信息: {e}") excel.Application.Quit() print("转换完成") 注意:使用win32com方法时,如果原文件已经打开,可能会失败。另外,转换后原文件仍然存在,新文件是xlsx格式。 用户可以根据自己的需求选择其中一种方法。 最后,我们生成相关问题: 1. 使用pandas转换xls到xlsx时,如何保留原格式? 2. 使用win32com转换时,如何避免Excel进程在后台运行? 3. 如何批量将xlsx文件转换回xls格式? 4. 在Linux系统下,除了pandas还有什么方法可以实现xls到xlsx的转换? 注意:在回答中,我们引用了两个来源,所以我们在回答末尾添加引用标识。 但是,我们提供的代码主要参考了引用[1]和引用[2],所以我们在相关地方添加引用。 因此,我们回答如下:</think>### Python将xLS文件转换为xLSX格式的两种方法 #### 方法一:使用pandas库(跨平台推荐) ```python import os import pandas as pd def convert_xls_to_xlsx(folder_path): """将指定文件夹内所有xls文件转换为xlsx格式""" os.chdir(folder_path) # 切换到目标文件夹 xls_files = [f for f in os.listdir() if f.lower().endswith('.xls') and not f.endswith('x')] for i, filename in enumerate(xls_files, 1): print(f'正在转换第{i}/{len(xls_files)}个文件: {filename}') try: # 读取xls文件 df = pd.read_excel(filename, engine='xlrd') # 生成新文件名(保留原名称) new_name = os.path.splitext(filename)[0] + '.xlsx' # 保存为xlsx格式 df.to_excel(new_name, index=False, engine='openpyxl') print(f'✓ 成功转换: {filename} → {new_name}') except Exception as e: print(f'✕ 转换失败: {filename} - 错误信息: {str(e)}') print('所有文件转换完成!') if __name__ == "__main__": folder_path = input("请输入包含xls文件文件夹路径: ").strip() convert_xls_to_xlsx(folder_path) ``` **优点**: - 跨平台支持(Windows/Mac/Linux) - 无需安装Microsoft Excel - 依赖库安装简单: ```bash pip install pandas openpyxl xlrd==1.2.0 # xlrd 1.2.0是最后一个支持.xls的版本 ``` **注意事项**: 1. 复杂格式(如宏、图表)可能丢失[^1] 2. 大文件处理速度较慢 3. 需确保安装xlrd 1.2.0(新版不再支持.xls) #### 方法二:使用win32com(仅Windows,保留完整格式) ```python import os import win32com.client as win32 def convert_with_excel(folder_path): """通过Excel应用程序转换(保留原始格式)""" excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 后台运行 os.chdir(folder_path) xls_files = [f for f in os.listdir() if f.lower().endswith('.xls')] for i, filename in enumerate(xls_files, 1): print(f'转换中({i}/{len(xls_files)}): {filename}') try: full_path = os.path.abspath(filename) wb = excel.Workbooks.Open(full_path) new_path = os.path.splitext(full_path)[0] + '.xlsx' wb.SaveAs(new_path, FileFormat=51) # 51 = xlsx格式 wb.Close() print(f'✓ 转换成功: {filename}') except Exception as e: print(f'✕ 转换失败: {filename} - {str(e)}') excel.Application.Quit() print('转换完成!') if __name__ == "__main__": folder_path = input("请输入xls文件所在文件夹路径: ").strip() convert_with_excel(folder_path) ``` **优点**: - 保留所有原始格式(公式、图表、宏等)[^2] - 转换质量更高 - 依赖库安装: ```bash pip install pywin32 ``` **注意事项**: 1. 仅支持Windows系统 2. 需安装Microsoft Excel 3. 进程需显式关闭,避免内存泄漏 ### 关键区别对比 | 特性 | pandas方法 | win32com方法 | |--------------------|---------------------|-------------------| | 平台支持 | 全平台 | 仅Windows | | 格式保留 | 基本数据 | 完整格式 | | 执行速度 | 较慢 | 较快 | | 外部依赖 | 无需Excel | 需安装Excel | | 大文件处理 | 可能内存溢出 | 更稳定 | | 特殊内容支持 | 有限 | 支持VBA宏/图表 | ### 使用建议 1. **简单数据转换** → 选择pandas方案(跨平台) 2. **复杂工作簿转换** → 选择win32com方案(保留格式) 3. **批量处理前** → 先备份原始文件 4. **文件名规范** → 避免包含特殊字符`[ ] : * ?` > 两种方法都会**保留原始xls文件**,仅生成新的xlsx副本。转换后请验证数据完整性,特别是公式和特殊格式的准确性[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pliosauroidea

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

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

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

打赏作者

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

抵扣说明:

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

余额充值