Python CSV 乘法比较
我想确认一下我在Python中把这个搞定的思路,所以希望能有一些例子。
我需要比较两个CSV文件(格式完全相同,都是2行6列),并找出它们的不同之处。
我需要把这两个文件都读进来,然后把第二行的第2到第6列的值乘以特定的数字(5),分别计算总和,然后比较这两个总和(CSV2的总和/CSV1的总和),最后以百分比的形式展示结果。
我觉得用import csv和reader是个不错的选择,但对我来说比较棘手的部分是如何把数据放进一个可以用来乘以不同值的列表(或者我应该用其他集合类型?),然后以最简洁高效的方式比较这两个数据。
代码更新(根据第二个回答-非常棒,谢谢!但现在在调用我的行值为整数时遇到错误):
import csv
file1 = open('csv1.csv', 'rb')
csv1 = csv.DictReader(file1)
file2 = open('csv2.csv', 'rb')
csv2 = csv.DictReader(file2)
myList = csv2.fieldnames
myList.append('Difference')
outFile = open('outFilename.csv', 'wb')
outCsv = csv.DictWriter(outFile, myList)
file1Dict = dict()
file2Dict = dict()
for row in file1:
file1Dict[row['key value']]['Total1'] = {'Total1':(int(row[1]) * .75 + int(row[2]) * 2.25 + int(row[3]) * 3.5 + int(row[4]) * 5 + int(row[5]) * 25)}
for row in file2:
file2Dict[row['key value']]['Total2'] = {'Total2':(int(row[1]) * .75, int(row[2]) * 2.25, int(row[3]) * 3.5, int(row[4]) * 5, int(row[5]) * 25)}
outFile.writeheader()
for stuff in file1Dict:
file1Dict[stuff]['Difference'] = str(int(int(file1Dict[stuff]['Total2']) / int(file1Dict[stuff]['Total1'])) * 100) + '\%'
outFile.writerow(file1Dict[stuff])
print 'difference'
2 个回答
0
import csv
file1 = open('filename1.csv', 'rb')
csv1 = csv.DictReader(file1)
file2 = open('filename2.csv', 'rb')
csv2 = csv.DictReader(file2)
myList = csv2.fieldnames
myList.append('Total1','Total2', 'Difference')
outFile = open('outFilename.csv', 'wb')
outCsv = csv.DictWriter(outFile, myList)
file1Dict = dict()
file2Dict = dict()
for rows in file1:
file1Dict[rows['key value']] = {rows[0], rows[1], 'Total1':int(rows[1]) * 5}
for rows in file2:
file1Dict[rows['key value']]['Total2'] = {'Total2':int(rows[1]) * 5}
outFile.writeheader()
for stuff in file1Dict:
file1Dict[stuff]['Difference'] = str(int(int(file1Dict[stuff]['Total2']) / int(file1Dict[stuff]['Total1'])) * 100) + '\%'
outFile.writerow(file1Dict[stuff])
这是一个快速整理的内容,按照你描述的来做,没有使用任何非标准的模块。
0
我觉得你应该使用Python的Pandas库,还有它里面的read_csv
函数。这样做会很高效,而且能把数据整理成一个矩形的格式,这样做数学运算就简单多了,也能方便地比较两个不同的数据集。
需要注意的是,在导入了pandas
之后,可以直接使用全局的read_csv
,用法是pandas.read_csv("/path/to/file.csv")
,而不需要像上面链接的文档那样通过io.parsers
来调用。
通过标准模块来做这些操作也没问题;不过我觉得如果你打算进行一些汇总或者广播的数学运算,Pandas提供的矩形数组结合高效的NumPy数学运算是最好的选择。