Python 比较两个文件夹中同名CSV文件的内容

Python遍历CSV文件修改表头 套用【Python编程快速上手—让繁琐工作自动化】一书中捋清思路的方法,从思路到代码行为、从抽象(想法)到具体(方法)、递进列出代码需要实现的内容。 总的来说,该程序必须做到以下几点: 找出当前工作目录中的所有 CSV 文件 读取每个文件的全部内容 修改第一行,将内容写入一个新的 CSV 文件 在代码层面上,这意味着该程序需要做到以下几点: 循环遍历从 os.listdir()得到... 阅读详情

步骤

  1. 获取A文件夹和B文件夹中所有csv文件的文件名。

  2. 遍历A文件夹中的每个csv文件,检查B文件夹中是否存在同名文件。

  3. 如果存在,比较两个文件的内容是否完全相同。

  4. 如果内容不同,则输出文件名;如果所有同名文件都一致,则输出一致的信息。

V1.0

import os
import pandas as pd
import filecmp

def compare_csv_folders(folder_a, folder_b):
    # 获取两个文件夹中的文件列表
    files_a = set(f for f in os.listdir(folder_a) if f.endswith('.csv'))
    files_b = set(f for f in os.listdir(folder_b) if f.endswith('.csv'))
    
    # 找出共同的文件名
    common_files = files_a & files_b
    different_files = []
    
    # 比较每个共同文件
    for file_name in common_files:
        path_a = os.path.join(folder_a, file_name)
        path_b = os.path.join(folder_b, file_name)
        
        if not filecmp.cmp(path_a, path_b, shallow=False):
            dfa = pd.read_csv(path_a)
            dfb = pd.read_csv(path_b)
            if dfa.shape == dfb.shape:
                if not dfa.equals(dfb):
                    different_files.append(file_name)
            else:
                different_files.append(file_name)

    # 输出结果
    if not different_files:
        if common_files:
            print("两个文件夹中所有同名CSV文件内容完全一致")
        else:
            print("未找到同名CSV文件")
    else:
        print("以下文件内容不一致:")
        for file_name in different_files:
            print(file_name)

# 使用示例
folder_a = 'A'  # A文件夹路径
folder_b = 'B'  # B文件夹路径

compare_csv_folders(folder_a, folder_b)

说明

  • 找出两个文件夹中同名的CSV文件
  • 使用二进制方式比较文件内容(包括元数据)
  • 输出内容不一致的文件名
  • 如果所有文件都一致,则显示成功消息

添加了进度条、英语注释和函数文档的 V1.1

import os
import filecmp
import pandas as pd
from tqdm import tqdm  # For progress bar display

def compare_csv_folders(folder_a: str, folder_b: str) -> None:
    """
    Compare CSV files with the same name in two folders and report differences.
    
    Args:
        folder_a (str): Path to the first folder containing CSV files
        folder_b (str): Path to the second folder containing CSV files
    
    Returns:
        None: Results are printed to the console
    """
    # Get list of CSV files in both folders
    files_a = set(f for f in os.listdir(folder_a) if f.endswith('.csv'))
    files_b = set(f for f in os.listdir(folder_b) if f.endswith('.csv'))
    
    # Find common filenames
    common_files = files_a & files_b
    different_files = []
    
    # Display information about found files
    print(f"Folder A contains {len(files_a)} CSV files")
    print(f"Folder B contains {len(files_b)} CSV files")
    print(f"Found {len(common_files)} common CSV files to compare")
    
    # Compare each common file with progress bar
    for file_name in tqdm(common_files, desc="Comparing files", unit="file"):
        path_a = os.path.join(folder_a, file_name)
        path_b = os.path.join(folder_b, file_name)
        
        if not filecmp.cmp(path_a, path_b, shallow=False):
            dfa = pd.read_csv(path_a)
            dfb = pd.read_csv(path_b)
            if dfa.shape == dfb.shape:
                if not dfa.equals(dfb):
                    different_files.append(file_name)
            else:
                different_files.append(file_name)
    
    # Output results
    print("\n" + "="*50)
    if not different_files:
        if common_files:
            print("✓ All common CSV files have identical content")
        else:
            print("⚠ No common CSV files found to compare")
    else:
        print(f"⚠ Found {len(different_files)} files with different content:")
        for file_name in different_files:
            print(f"  - {file_name}")
    print("="*50)


if __name__ == "__main__":
    # Example usage
    folder_a = 'A'  # Path to folder A
    folder_b = 'B'  # Path to folder B
    
    compare_csv_folders(folder_a, folder_b)

使用说明

  • 需要安装 tqdm 包来显示进度条:
	   pip install tqdm
  • 显示每个文件夹中的CSV文件数量
  • 显示找到的同名文件数量
  • 使用进度条显示比较进度
  • 输出比较结果

V 2.0

使用多进程可以显著加速CSV文件的读取和比较过程,特别是当文件数量较多或文件较大时。以下是改进后的代码,使用Python的multiprocessing模块实现并行处理:

import os
import filecmp
import pandas as pd
from tqdm import tqdm
import multiprocessing as mp
from functools import partial

def compare_single_file(file_name, folder_a, folder_b):
    """比较单个CSV文件的内容"""
    path_a = os.path.join(folder_a, file_name)
    path_b = os.path.join(folder_b, file_name)
    
    # 首先使用二进制比较,如果二进制相同则内容一定相同
    if filecmp.cmp(path_a, path_b, shallow=False):
        return file_name, True
    
    # 二进制不同,再使用pandas比较内容
    try:
        dfa = pd.read_csv(path_a)
        dfb = pd.read_csv(path_b)
        
        # 比较形状和内容
        if dfa.shape == dfb.shape and dfa.equals(dfb):
            return file_name, True
        else:
            return file_name, False
    except Exception as e:
        print(f"Error comparing {file_name}: {str(e)}")
        return file_name, False

def compare_csv_folders(folder_a: str, folder_b: str) -> None:
    """
    Compare CSV files with the same name in two folders and report differences.
    
    Args:
        folder_a (str): Path to the first folder containing CSV files
        folder_b (str): Path to the second folder containing CSV files
    
    Returns:
        None: Results are printed to the console
    """
    # Get list of CSV files in both folders
    files_a = set(f for f in os.listdir(folder_a) if f.endswith('.csv'))
    files_b = set(f for f in os.listdir(folder_b) if f.endswith('.csv'))
    
    # Find common filenames
    common_files = list(files_a & files_b)
    different_files = []
    
    # Display information about found files
    print(f"Folder A contains {len(files_a)} CSV files")
    print(f"Folder B contains {len(files_b)} CSV files")
    print(f"Found {len(common_files)} common CSV files to compare")
    
    # 使用多进程并行比较文件
    print("Comparing files with multiprocessing...")
    
    # 创建进程池
    with mp.Pool(processes=mp.cpu_count()) as pool:
        # 使用partial固定folder_a和folder_b参数
        compare_func = partial(compare_single_file, folder_a=folder_a, folder_b=folder_b)
        
        # 使用进程池并行处理,同时使用tqdm显示进度
        results = []
        for result in tqdm(pool.imap(compare_func, common_files), 
                          total=len(common_files), desc="Comparing files", unit="file"):
            results.append(result)
    
    # 收集不同内容的文件
    different_files = [file_name for file_name, is_same in results if not is_same]
    
    # Output results
    print("\n" + "="*50)
    if not different_files:
        if common_files:
            print("✓ All common CSV files have identical content")
        else:
            print("⚠ No common CSV files found to compare")
    else:
        print(f"⚠ Found {len(different_files)} files with different content:")
        for file_name in different_files:
            print(f"  - {file_name}")
    print("="*50)

if __name__ == "__main__":
    # 确保多进程在Windows下正常工作
    mp.freeze_support()
    
    # Example usage
    folder_a = 'A'  # Path to folder A
    folder_b = 'B'  # Path to folder B
    
    compare_csv_folders(folder_a, folder_b)

主要改进点

  1. 多进程处理:使用multiprocessing.Pool创建进程池,并行处理文件比较任务
  2. 进程数优化:默认使用CPU核心数作为进程数(mp.cpu_count())
  3. 进度显示:保持使用tqdm显示进度条
  4. 错误处理:添加异常捕获,防止单个文件错误导致整个程序崩溃
  5. 二进制比较优化:先进行快速的二进制比较,只有在二进制不同的情况下才使用pandas进行内容比较

注意事项

  • 在多进程环境下,每个进程都有独立的内存空间,这意味着内存使用量可能会增加

  • 在Windows系统上,多进程需要if name == “main”:保护,并使用mp.freeze_support()

Python将.dat文件转换成.csv文件 在找数据的时候有时候会找到.dat文件,我发现了两种方式。 第一种很简单,是利用可以打开dat的软件进行转换,但是这种方式在只有一个数据的时候可以使用,数据集多时很不方便。 另一种就是使用python代码,可以将某一目录下的所有文件.dat转换为csv【其实不止这两种,xls、csv、dat等之间转换都可以,看自己的需求】 一、利用数据软件转换 1.sublime+excel 把下载的文... 阅读详情

相关推荐

[python]批量将一个文件夹里的xls另存为同名的csv格式

[python]批量将一个文件夹里的xls另存为同名的csv格式

天赐好车的博客 282

python比较两个csv文件,并打印出不同的行号,列号,数据

【代码】python比较两个csv文件,并打印出不同的行号,列号,数据。

u012780083的博客 1284

Python-csvdiff用于比对CSV文件区别的PythonCLI工具和库

csv-diff:用于比对CSV文件区别的Python CLI工具和库

shell脚本 比较两个csv文件是否相同,Demo总结

执行下面的命令获取,根据第四个参数对csv进行升序排序,将比较结果存为临时文件。比较两个临时文件,如果文件相同则删除临时文件,如果文件不同,则保留临时文件。=表示取消之前的权限,并给予唯一的权限。r表示Read,即读文件;w表示Write,即写文件;表示对当前目录下的mkdir.sh文件的所有者增加可执行权限。创建一个compare.sh文件,并且直接进行编辑。仅仅创建一个compare1.sh,不进行编辑模式。vim打开脚本时出现e325:attention。对于.sh文件进行操作。

qq_45325310的博客 986

python-比较两个文件的内容差异,并显示

用python 实现两个文本文件之间的比较,并生成可视化HTML文件。

Qoder Quest 模式实战:从需求到代码的自动化开发

本文深入探讨Qoder Quest模式如何实现从需求到代码的自动化开发。通过编写清晰的Spec规格说明,Qoder能智能分解任务并在后台执行,生成高质量代码,大幅提升开发效率,让开发者专注于架构设计等创造性工作。

herb5的博客 1154

Python 比较两个 CSV 文件并打印差异

本文将讨论比较两个 CSV 文件的各种方法。我们将包括执行此操作的最“Pythonic”方式和可帮助简化此任务的外部 Python 模块。最后,我们将包括一种使用 Pandas DataFrames 识别 CSV 文件差异的方法。我们假设需要比较的两个 CSV 文件的标题为 file1.csv 和 file2.csv。您可以根据需要重命名文件。还请在下面给出的代码片段中适当地替换文件名。

迹忆客 3907

Oracle19c SYSAUX表空间爆满?手把手教你清理SM/ADVISOR和AUDSYS占用(附完整SQL)

本文详细解析了Oracle19c中SYSAUX表空间爆满的常见原因及解决方案,重点针对SM/ADVISOR和AUDSYS组件的空间占用问题提供了完整的SQL清理脚本。通过诊断查询、空间清理和预防性维护策略,帮助DBA有效管理SYSAUX表空间,确保数据库稳定运行。

weixin_28338005的博客 243

比较两个CSV文件

两个文件分别为username1.csv和username2.csv import csv bias = 10e-4 def compare_float(num1, num2): if abs(num1 - num2) < bias: return True else: return False def compare_file(filePath1, filePath2): with open(filePath1, encoding='u

度凡心的博客 1952

stm32学习笔记-启动文件

1、配置栈 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp EQU:相当于C中的define,定义Stack_Size = 0x00000400。 AREA: 指...

某风吾起的博客 4531

Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册

前言 相比与Xilinx和Altera在国内的市场,Microsemi的FPGA在国内应用很少很少,网上几乎没有详细的教程,刚开始使用时,遇到了各种问题,自己也走了不少弯路。本系列教程以Libero V11.8.2.4,SmartFusion系列A2F200M3F FPGA芯片为例,将详细介绍Libero SoC软件的基本使用,及使用过程中遇到一些问题的解决方法。 Libero 简介 关于Lib...

whik1194的博客 3万+

使用 Python 比较两个 Csv 文件

我们有两个文件,我们的任务是根据两个 CSV 文件在 Python 中的差异进行比较。在本文中,我们将看到一些比较两个 CSV 文件并打印差异的常用方法。

qq_36078275的博客 1971

[VCS]VCS dump fsdb的精细化控制

本文介绍了VCS FSDB波形dump的精细化控制方法。主要内容包括:1)基本dump方式;2)通过$fsdbDumpoff排除特定层次;3)使用$fsdbDumpvars选择性dump指定模块;4)运行时动态控制dump开关;5)通过文件管理排除列表($fsdbDumpoffFile或自定义读取);6)层次控制策略(剪除整棵树或仅当前层)。这些方法可有效控制波形文件大小,提高仿真效率。

元直的博客 1035

Python依据某一文件夹中大量文件的名称复制另一文件夹中的同名文件

本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件的名称,从另一个文件夹中找到与这一文件夹中文件同名的文件,并将找到的同名文件复制到第三个文件夹中的方法~

疯狂学习GIS的博客 838

G.6 PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】

百度飞桨:ERNIE 3.0 、通用信息抽取 UIE、paddleNLP的安装使用[一]_汀、的博客-优快云博客PaddleHub--飞桨预训练模型应用工具{风格迁移模型、词法分析情感分析、Fine-tune API微调}【一】_汀、的博客-优快云博客 PaddleHub--{超参优化AutoDL Finetuner}【二】_汀、的博客-优快云博客PaddleHub实战篇{词法分析模型LAC、情感分类ERNIE Tiny}训练、部署【三】_汀、的博客-优快云博客通过前面几篇文章大家都有一定了解,下面

丨汀、的博客 6186

进阶06:C#连接TwinCAT 3使用ADS通讯

本文介绍了使用C#通过ADS协议与倍福TwinCAT3 PLC通讯的实现方法。主要内容包括:1)在两台电脑上安装TwinCAT3开发环境并建立网络连接;2)在TwinCAT中定义变量和结构体;3)使用C# Winform开发界面,通过TwinCAT.Ads.dll实现读写功能;4)实现主动读取和通知两种数据获取方式。详细说明了连接建立、变量定义、读写操作及事件通知的实现代码。该方案实现了对PLC寄存器数据的实时监控和操作,为工业控制系统的开发提供了参考。

weixin_38637405的博客 3690

Python批量处理csv文件(筛选列)

Python批量处理csv文件前言代码总结 前言 批量读取同一文件夹下的csv文件,进行数据处理(这里是挑选需要的列向量,生成新文件),保存到新文件夹(csv文件同名) 代码 #!/user/bin/env python3 # -*- coding: utf-8 -*- import os import re import datetime import numpy as np import pandas as pd starttime = datetime.datetime.now() # 运行时间统

sme2457的博客 5535

Cadence PCB 仿真宝典【目录】

欢迎大家来到《Cadence PCB 仿真宝典》该专栏包括【入门篇】【提升篇】【技巧篇】【疑难篇】四个部分,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 3271

Python将excel文件保存为同名csv文件

from pathlib import Path import pandas as pd #获取文件夹地址 folder_path = Path('F:\\data\\newdata') #读取所有excel文件 file_list = folder_path.glob('*.xlsx') for i in file_list: data = pd.read_excel('F:\\data\\newdata\\' + i.name, sheet_name='Sheet') data.to_c

weixin_43760388的博客 1293

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

使用Python截取nc文件数据保存到CSV文件

问题要求: 编写一个函数完成以下任务:截取经度在23°N-40°N,纬度在118°E-131°E范围内各属性不同深度的数据,使用Python中合适的数据结构将截取的数据保存到同名CSV文件中。(nc文件数据格式参见笔者其他文章) 实验内容(附代码) 实验数据介绍(通过实验介绍你对NC数据的认识) nc文件即NetCDF全称为network Common Data Forma...

7TribeZ的博客 8202

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python csv文件写成txt_Python实现txt文件转csv格式

码农公社 210.net.cn210= 102410月24日一个重要的节日--码农(程序员)节把txt文件转成成csv文件格式,通过手动打开excel文件,然后导入txt来生产csv文件。现在每周有大量的数据要处理,手动方式太不现实,决定用python自动化脚本来实现,思路:1.读取文件夹中所有txt文件,保存到list中2.对每个txt文件,自动生成同名的csv文件3.对每个txt文件...

weixin_39531635的博客 442

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python保存dat文件_Python:如何将* .dat文件另存为* .csv文件到新文件夹

I have a folder with lots of *.dat files (which were created with the program IDL). I am able to take one single file, convert it to a *.csv file and save it in a different (already existing) folder:i...

weixin_39715460的博客 570

python合并两个文件夹下相同文件名的csv文件

要求:python合并两个文件夹下相同文件名的csv文件。

qq_32649321的博客 353

python保存dat文件,Python:如何将* .dat文件另存为* .csv文件到新文件夹

I have a folder with lots of *.dat files (which were created with the program IDL). I am able to take one single file, convert it to a *.csv file and save it in a different (already existing) folder:i...

weixin_39687667的博客 479

python统计成绩数据中如何去掉表头,python 从 CSV 文件中删除表头

假设你有一个枯燥的任务,要删除几百 CSV 文件的第一行。也许你会将它们送入一个自动化的过程,只需要数据,不需要每列顶部的表头。可以在 Excel 中打开每个文件,删除第一行,并重新保存该文件,但这需要几个小时。让我们写一个程序来做这件事。该程序需要打开当前工作目录中所有扩展名为.csv 的文件,读取 CSV 文件的内容,并除掉第一行的内容重新写入同名的文件。这将用新的、无表头的内容替换CSV 文...

weixin_28909295的博客 2099

使用python整合文件夹及子文件夹内多个csv文件

实现原地刷新,不会刷屏。只保留第一个文件的表头。

perrylam999的博客 253
上一篇: 从零开始学习Dash和Plotly:基础学习
下一篇: Python NumPy 入门指南
偷心伊普西隆
博客等级 码龄7年 511粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值