Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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_Unit Testing_Csv - Fatal编程技术网

Python:如何检查两个具有标题行的CSV文件是否包含相同的信息,而不考虑行和列的顺序?

Python:如何检查两个具有标题行的CSV文件是否包含相同的信息,而不考虑行和列的顺序?,python,unit-testing,csv,Python,Unit Testing,Csv,对于方法的单元测试,我想将该方法生成的CSV文件(实际结果)与手动创建的CSV(预期结果)进行比较 如果第一行的字段完全相同(即标题),并且如果其余行包含相同的信息,则认为这些文件是相等的 以下内容必须无关紧要:列的顺序、行的顺序(标题行除外)、空行、行尾编码、布尔值的编码 将csv文件的相应头作为键,第一行作为值存储在字典中 阅读第二个文件并用字典检查 我建议使用以下方法: >>> import pyexcel as pe >>> expected_shee

对于方法的单元测试,我想将该方法生成的CSV文件(实际结果)与手动创建的CSV(预期结果)进行比较

如果第一行的字段完全相同(即标题),并且如果其余行包含相同的信息,则认为这些文件是相等的

以下内容必须无关紧要:列的顺序、行的顺序(标题行除外)、空行、行尾编码、布尔值的编码

将csv文件的相应头作为键,第一行作为值存储在字典中
阅读第二个文件并用字典检查


我建议使用以下方法:

>>> import pyexcel as pe
>>> expected_sheet = pe.load("expected.csv", name_columns_by_row=0)
>>> actual_sheet = pe.load("actual.csv", name_columns_by_row=0)
>>> assert actual_sheet.to_dict() == expected_sheet.to_dict() # where to_dict() returns
>>> # an ordered dict of the content

现在已经很晚了,所以我来草拟解决方案

  • 使用
    csv.reader
    输入数据,比较标题,标准化布尔值
  • 临时转置两个列表列表并在标题上对它们进行排序,如

    cols = zip(*data)
    data = zip(*sorted(cols))
    
    对两个数据集重复此操作,以便现在两个数据集中的列对齐

  • 逐行比较这两个数据集


  • 字典法似乎是一条正确的道路。不幸的是,它不适用于布尔值,因为它们可以被编码为
    “True”
    'TRUE'
    'TRUE'
    这两个字符串是不同的,因此不相等。@布尔值被喷洒到所有列上或构成许多布尔值列的内容?@黑星布尔值出现在以“is*”开头的列中,例如“is_done”。我最终得到了一个稍微不同的解决方案:在读取和规范化数据之后,预期的和实际的数据都存储在字典列表中。然后通过
    unittest.assertItemsEqual()
    函数比较这些参数。