问题描述
我有两个包含以下内容的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()
1楼
根据我认为您的代码正在尝试执行的操作(输出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()
2楼
这是问题得到后的另一个答案。 解决此问题(查找两个文件之间的值差异)非常复杂,需要分解为几个步骤:
- 打开两个文件并将它们读入python变量
- 将原始CSV文件转换为浮点数的python数组
- 找到它们之间的差异并将结果放入新数组中
- 将此结果数组转换为原始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
结论:
如果您有任何疑问或需要任何澄清,请随时发表评论。