Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个csv文件并输出更改_Python_Python 3.x_Csv - Fatal编程技术网

Python 比较两个csv文件并输出更改

Python 比较两个csv文件并输出更改,python,python-3.x,csv,Python,Python 3.x,Csv,我有两个CSV文件,它们都不同但相似。我想比较它们和输出更改,以及是否添加或删除了变量。我想在新的CSV或文本文件中输出更改 下面是一些我已经尝试过的代码以及两个csv文件。我也愿意使用difflib并将其输出到文本文件 file1.csv: name1,2.0001 name2,3.4010 name4,4.0000 name5,1.0000 name6,1.0000 name8,1.9001 name10,2.7654 file2.csv: name1,3.0000 name2,3.401

我有两个CSV文件,它们都不同但相似。我想比较它们和输出更改,以及是否添加或删除了变量。我想在新的CSV或文本文件中输出更改

下面是一些我已经尝试过的代码以及两个csv文件。我也愿意使用difflib并将其输出到文本文件

file1.csv:

name1,2.0001
name2,3.4010
name4,4.0000
name5,1.0000
name6,1.0000
name8,1.9001
name10,2.7654
file2.csv:

name1,3.0000
name2,3.4010
name3,1.0000
name5,1.0901
name6,1.0000
name7,3.4445
name11,8.0009
name12,0.1180
以下是我尝试过的代码:

with open('file1.csv', 'r') as file1, open('file2.csv', 'r') as file2:
    file1 = file1.readlines()
    file2 = file2.readlines()

with open('new_file.csv', 'w') as outFile:
    for line in file2:
        if line not in file1:
            outFile.write(line)
预期输出将是csv文件或文本文件,显示如下内容:

name1 value changed from 2.0001 to 3.0000
name3 value added
name4 value removed
name5 value changed from 1.0000 to 1.0901
name7 value added
name8 value removed
name10 value removed
name11 value added
name12 value added

使用文件比较工具,例如Unix/Linux下的
diff(1)

要比较两个表。正确的作业工具是关系数据库

您的代码片段使用Python。Python自带sqlite3数据库引擎,但我不认为有理由将Python用于您请求的简单处理任务

相反,我会在
sqlite3
本身中完成它,包装在一个shell脚本中:

#/bin/bash
#比较-CSVs.bash

sqlite3我的解决方案是将每个csv转换成一个字典,第一列作为键,第二列作为值。之后,我可以循环遍历这些键,并确定是否更改、删除或添加了相应的值

import csv
import re


def csv2dict(filename):
    with open(filename) as file_handle:
        reader = csv.reader(file_handle)
        dict_object = dict(reader)
        return dict_object


def separate_text_and_number(value):
    text, number = re.match(r'(\D+)(\d+)', value).groups()
    number = int(number)
    return (text, number)


def main():
    """ Entry """
    csv1 = csv2dict('file1.csv')
    csv2 = csv2dict('file2.csv')
    all_keys = csv1.keys() | csv2.keys()

    for key in sorted(all_keys, key=separate_text_and_number):
        if key not in csv2:
            print(f'{key} value removed')
        elif key not in csv1:
            print(f'{key} value added')
        elif csv1[key] != csv2[key]:
            print(f'{key} value changed from {csv1[key]} to {csv2[key]}')


if __name__ == '__main__':
    main()
输出 笔记
  • 函数
    csv2dict
    打开一个文件并将内容转换为字典
  • 功能
    separate_text_和_number
    name14
    拆分为
    ('name',14)
    ,以帮助对键进行排序
  • 在Python3中,
    dict.keys()
    方法返回一个类似集合的对象,该对象包含所有键。我使用
    |
    操作符查找两组键的并集
  • 为了获得更可读的输出,我使用
    separate\u text\u和\u number

看起来您应该合并这两个文件并分析results@mucio请您澄清一下好吗?您可以将文件的内容放在两个结构中,可能是dict,然后对它们进行迭代,以查看值是否存在或在另一个文件中是否发生了更改。或者你可以用熊猫(及其连接物)这样的东西来做。你检查过这个答案吗?我不想把名字分开,因为我只是把它作为一个例子。我实际上处理的只是不同的字符串。如果我不想使用
分隔文本和数字
,我会将key设置为什么?在这种情况下,只需使用
进行键入排序(所有键):
并忘记
键=…
部分。如果您不关心排序,那么对于所有键中的键:
import csv
import re


def csv2dict(filename):
    with open(filename) as file_handle:
        reader = csv.reader(file_handle)
        dict_object = dict(reader)
        return dict_object


def separate_text_and_number(value):
    text, number = re.match(r'(\D+)(\d+)', value).groups()
    number = int(number)
    return (text, number)


def main():
    """ Entry """
    csv1 = csv2dict('file1.csv')
    csv2 = csv2dict('file2.csv')
    all_keys = csv1.keys() | csv2.keys()

    for key in sorted(all_keys, key=separate_text_and_number):
        if key not in csv2:
            print(f'{key} value removed')
        elif key not in csv1:
            print(f'{key} value added')
        elif csv1[key] != csv2[key]:
            print(f'{key} value changed from {csv1[key]} to {csv2[key]}')


if __name__ == '__main__':
    main()
name1 value changed from 2.0001 to 3.0000
name3 value added
name4 value removed
name5 value changed from 1.0000 to 1.0901
name7 value added
name8 value removed
name10 value removed
name11 value added
name12 value added