2012-09-20 47 views
0

我已經問過類似這樣的問題,但我會再試一次,因爲我還有一些問題。Python比較差異 - 第2部分

我有兩個csv文件有3列。

名稱產品數量:

我想了解兩個文件之間的差異。如果兩個文件的名稱和產品順序相同,我可以這樣做。這會給我我正在尋找的金額的差異。

我需要的東西,將採取列出和比較兩者,並顯示差異,如果不是在相同的順序。

我曾嘗試:

import csv 
import difflib 


file1 = open('file1','rb').read().splitlines() 
file2 = open('file1','rb').read().splitlines() 

for diff in difflib.ndiff(file1, file2): 
    print(diff) 

但是,如果任何事情出了毛病沒有好處。有沒有一種方法可以將每個「名稱產品數量」分組,並與文件2進行比較,在該文件中我已將每個「名稱產品數量」進行了分組,並且如果文件1和文件2之間存在差異,則表明該差異。

+0

值得一提的是,可以循環直接通過文件 - 不需要做''閱讀()splitlines( )''(如果你需要一個列表,它會更好地簡化爲''.readlines()'')。另外,使用上下文管理器(['with''語句](http://preshing.com/20110920/the-python-with-statement-by-example))打開文件可能是值得的。 –

+0

@Lattyware:'difflib.ndiff'(至少2.7)需要字符串列表,而不是字符串文件或迭代器,所以他確實需要列表。當然,除非他可以使用不同的功能。但是你說得對,'readlines()'仍然比'read()。splitlines()'好。 – abarnert

+0

@abarnert這是真的,我會建議你簡單的''readlines()''然後你說。 –

回答

3

您可以使用python builtin函數sorted(alist)對行進行排序或使用alist.sort()對其進行排序。

此外,您可以使用UNIX命令sort上的文件,然後在python中打開它們。這樣你就可以確定它們都是有序的。

+0

當然,在Python中打開任何東西之前,他還可以使用命令'diff'調用'sort'的結果... – abarnert

0

您確定首先需要difflib嗎?

首先,你只想要最小的差異線,而不是任何上下文等,所以一個花式的差異算法是有點矯枉過正。

大概你會解析所產生的差異線,所以你可以總結數額。 (推測這就是爲什麼你要導入csv。)

所以,如果你打算這樣做,你可以導入值,然後,例如,做一個設置的差異。或者只是DIFF上的蒼蠅,像這樣(未經測試,只是爲了顯示這個想法):

import csv 

with open('file1', 'rb') as f: 
    d = {(name, product): amount for name, product, amount in csv.reader(f)} 
diff2 = 0.0 
with open('file2', 'rb') as f: 
    for name, product, amount in csv.reader(f): 
    if d.get((name, product)) == amount: 
    del d[(name, product)] 
    else: 
    diff2 += float(amount) 
diff1 = sum(float(amount) for amount in d.itervalues()) 
print diff1 - diff2 
+0

我不確定這比他的原始代碼更具可讀性。 –

+0

@HansThen:他的原始代碼沒有顯示執行任何迭代ndiff輸出,用csv解析它,將字符串轉換爲數字,彙總等等的實際工作。 – abarnert

+0

是的,你是對的,我是比較諺語不同的水果。 –