当前位置: 代码迷 >> python >> 比较CSVfile 1和CSVfile 2列值后,Python生成第三CSV
  详细解决方案

比较CSVfile 1和CSVfile 2列值后,Python生成第三CSV

热度:93   发布时间:2023-07-16 11:25:55.0

我有两个包含以下内容的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()

根据我认为您的代码正在尝试执行的操作(输出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中的文件处理是通过函数完成的,该函数采用打开文件的方式和模式( '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. 打开两个文件并将它们读入python变量
  2. 将原始CSV文件转换为浮点数的python数组
  3. 找到它们之间的差异并将结果放入新数组中
  4. 将此结果数组转换为原始CSV文件并将其保存到文件

第1步:

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

# 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分为两个阶段-获取最终数据,然后将文本字符串转换为数字(在这种情况下为浮点数)。 在第一阶段,我利用函数将整个数据行分离为单独的数据点。 例如:

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]] 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]] final2 [[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]] final2 [[1.0, 2.0, 4.0], [3.0, 2.0, 6.0], [6.0, 3.0, 1.0]] final2 [[1.0, 2.0, 4.0], [3.0, 2.0, 6.0], [6.0, 3.0, 1.0]]如果我们继续使用上面的相同文件。

第三步:

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

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

# 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']

第四步:

最后,需要将差异转换为原始csv文件并保存到磁盘。 为此,我使用了函数,该函数使用某个字符串将数组中的项目连接起来。 但是,这仅适用于字符串,这就是为什么我们之前必须进行转换。 例如:

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

结论:

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