我有两个包含以下内容的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()
答案 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步:
使用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}}
<强>结论:强>
如果您有任何疑问或需要任何澄清,请随时发表评论。