Python在比较CSVfile 1和CSVfile 2列值

时间:2018-02-11 16:18:18

标签: python csv

我有两个包含以下内容的csv文件:

CSVFile1:

Data A  Temp at City A  Temp at City B
87.900002   275.151367  273.20108
88.300003   275.213867  273.32608

CSVFile2:

Data A  Temp at City A  Temp at City B
79.266687   299.566367  213.20766
97.300003   306.213867  271.47999

我想创建一个新的CSV文件来获取列值的差异。结果应该是CSVFile 1和CSVFile 2之间的变化,我希望在新的csv中看到这种差异。

我试过了:

import numpy as np    

with open('old.csv', 'r') as t1, open('new.csv', 'r') as t2:
  fileone = t1.readlines()
  filetwo = t2.readlines()

with open('update.csv', 'w') as outFile:
  for line in filetwo:
    if line not in fileone:
        outFile.write(line)

np.savetxt(f, output,fmt="%f",delimiter=',')
f.close()

2 个答案:

答案 0 :(得分:0)

基于我认为你的代码试图做的事情(输出filetwo中所有不在fileone中的行),你可以使用array.count()命令。

file.readlines()返回一个数组,因此fileone和filetwo都可以像普通数组一样使用。如果该行不在fileone中,则该行的计数将为0,例如:

x = ["bob", "sandra", "david", "ralph"]
y = ["bob", "david"]

for name in x:
    if(y.index(name) == 0):
        print(name)

将输出:

bob
sandra

因此,在您的程序中,您可以替换:

for line in filetwo:
if line not in fileone:
    outFile.write(line)

使用:

for line in filetwo:
    if(fileone.count(line) == 0):
        outFile.write(line)

修改

python中的文件处理是通过open()函数完成的,该函数将文件和模式打开('w'用于写入(将完全覆盖文件)或'r'阅读)。例如:

data = open("data.csv", "w")

将打开该文件,然后可以使用data.write()将其写入。使用data.close完成后,可以关闭该文件。所有这些组合在一起给了我们:

difference = open("difference.csv", "w")

for line in filetwo:
    if(fileone.count(line) == 0):
        difference.write(line)

difference.close()

答案 1 :(得分:0)

这是reclarification问题之后的另一个答案。解决这个问题(发现两个文件之间的的差异)相当复杂,需要分解为几个步骤:

  1. 打开两个文件并将其读入python变量
  2. 将原始CSV文件转换为浮点数的python数组
  3. 找出它们之间的差异并将结果放入新数组
  4. 将此结果数组转换为原始CSV文件并将其保存到文件
  5. 第1步:

    使用open()函数在python中打开文件,该函数同时获取文件位置和模式('r'用于阅读或'w'用于写入,以及其他模式)。打开文件后,我们可以使用file.readlines()函数获取文件中的所有行,将它们作为数组返回,每个项目都是一行。使用这个:

    # Open files
    file1 = open("data1.csv", "r")
    file2 = open("data2.csv", "r")
    
    # Read all file lines
    data1 = file1.readlines()
    data2 = file2.readlines()
    
    # Close files
    file1.close()
    file2.close()
    

    例如,如果我们有文件data1.csv

    2,1,5
    7,2,4
    1,5,1
    

    data2.csv

    1,2,4
    3,2,6
    6,3,1
    

    然后,在此细分受众群结束时,data1等于['2,1,5\n', '7,2,4\n', '1,5,1']data2等于['1,2,4\n', '3,2,6\n', '6,3,1']

    第2步:

    步骤2分为两个阶段 - 获取最终数据,然后将文本字符串转换为数字(在本例中为浮点数)。在第一阶段,我利用array.split()函数将整行数据分成各个数据点。例如:

    x = "67,45,23"
    print(x.split(","))
    

    输出:

    ['67', '45', '23']
    

    但请注意,数字仍然是字符串,这就是我们需要第二阶段的原因,我在其中迭代每个单独的数据点并将其转换为浮点数(因此,当您创建数据文件时,您应该删除任何数据文件列标题可以阻止发生错误)。我将所有这些放在两个单独的函数中(一个用于获取数据,一个用于将其转换为浮点数),然后我调用两个数据集。

    # Extract an array from the rows of CSV data
    def getDataFromCSV(data):
        extract = []
        # Go through each row in the data
        for row in data:
            # Remove newline in from row
            row = row.strip()
            # Seperate row into individual columns
            row = row.split(",")
            # Add to the final data
            extract.append(row)
        # Return the extracted data
        return extract
    
    final1 = getDataFromCSV(data1)
    final2 = getDataFromCSV(data2)
    
    # Convert all data in an array to a float
    def convToFloat(data):
        newData = []
        # Iterate through each row
        for row in data:
            newRow = []
            # Go through each column
            for column in row:
                # Convert numbers to an float
                newRow.append(float(column))
            # Append new row to newData
            newData.append(newRow)
        # Replace dataset with new data
        return newData
    
    # Run function on both datasets
    final1 = convToFloat(final1)
    final2 = convToFloat(final2)
    

    如果我们继续使用上面的相同文件,则在调用这两个细分后,final1[[2.0, 1.0, 5.0], [7.0, 2.0, 4.0], [1.0, 5.0, 1.0]]final2[[1.0, 2.0, 4.0], [3.0, 2.0, 6.0], [6.0, 3.0, 1.0]]

    第3步:

    在步骤3中,我们找到两个数组之间的数值差异。首先,我创建一个数组来保存数据集之间的差异。然后,使用len()函数确定数据集中的行数以及列数(不用说,要比较两个数据集,它们都必须具有相同的行数和列数)。

    然后,我遍历两个数据集中的每一行,创建一个新的临时行,然后将其附加到差异数组。在此之前,每列都会通过,第二个文件中的数字将从第一个文件中的数字中删除,以找到它们之间的变化。这也被转换为同一行中的字符串 - 这对以后很重要。

    # Create difference array
    difference = []
    
    # Get the amount of rows in the dataset
    rows = len(final1)
    
    # Get the amount of columns in the dataset
    columns = len(final1[0])
    
    # Go through this for each row
    for row in range(rows):
        # Create a new row to put data in
        newRow = []
        # For each column in the row
        for column in range(columns):
            # Get the difference in the dataset and convert it to a string
            diff = str(final2[row][column] - final1[row][column])
            # Append it to the new row
            newRow.append(diff)
        # Add the new row to the final difference array
        difference.append(newRow)
    

    在此之后,difference数组为[['-1.0', '1.0', '-1.0'], ['-4.0', '0.0', '2.0'], ['5.0', '-2.0', '0.0']

    第4步:

    最后,差异需要转换为原始csv文件并保存到磁盘。为此,我使用str.join函数,该函数使用特定字符串连接数组中的项。这只适用于字符串,这就是我们之前必须进行转换的原因。例如:

    y = ["The", "small", "dog"]
    print(" - ".join(y))
    

    输出:

    The - small - dog
    

    我创建了一个output字符串来保存输出文件,然后我遍历每一行并使用,将数据点连接在一起,然后在其中添加换行符\n结束。然后我写一个文件 - 这就像读取文件一样简单,我再次使用'w'模式再次使用file.write()模式(警告 - 这将删除任何已经存在的文件)。然后简单调用# Create an output text file output = "" # Loop through the results for row in difference: # Append a csv-formatted list to the file output += ",".join(row) output += "\n" # Open a file to output to outputFile = open("output.csv", "w") # Write output outputFile.write(output) 函数和程序。像这样:

    output.csv

    -1.0,1.0,-1.0 -4.0,0.0,2.0 5.0,-2.0,0.0 文件的内容是:

    {{1}}

    <强>结论:

    如果您有任何疑问或需要任何澄清,请随时发表评论。