2017-10-16 79 views
1

打印相應的行我有這樣一個CSV文件:(無頭)搜索一個文件的行中的其他文件和蟒蛇

aaa,1,2,3,4,5 
bbb,2,3,4,5,6 
ccc,3,5,7,8,5 
ddd,4,6,5,8,9 

我想搜索另一個csv文件:(無頭)

bbb,1,2,3,4,5,,6,4,7 
kkk,2,3,4,5,6,5,4,5,6 
ccc,3,4,5,6,8,9,6,9,6 
aaa,1,2,3,4,6,6,4,6,4 
sss,1,2,3,4,5,3,5,3,5 

並打印第一個文件中存在的第二個文件中的行(基於第一列的匹配)。因此,結果將是:

bbb,1,2,3,4,5,,6,4,7 
ccc,3,4,5,6,8,9,6,9,6 
aaa,1,2,3,4,6,6,4,6,4 

我有下面的代碼,但它不顯示任何信息:

labels = [] 
with open("csv1.csv", "r") as f: 

    f.readline() 
    for line in f: 
     labels.append((line.strip("\n"))) 

with open("csv2.csv", "r") as f: 

    f.readline() 
    for line in f: 
     if (line.split(",")[1]) in labels: 
      print (line) 

如果可能的話,你能告訴我如何做到這一點,好嗎?我的代碼有什麼問題?提前致謝 !

+1

你有'熊貓'嗎? –

回答

1

這是一個解決方案,但你也可以看看具體的CSV工具和熊貓的建議:

labels = [] 
with open("csv1.csv", "r") as f: 
    lines = f.readlines() 
    for line in lines: 
     labels.append(line.split(',')[0]) 

with open("csv2.csv", "r") as f: 
    lines = f.readlines() 

with open("csv_out.csv", "w") as out: 
    for line in lines: 
     temp = line.split(',') 
     if any(temp[0].startswith(x) for x in labels): 
      out.write((',').join(temp)) 

程序首先收集從csv1.csv唯一標籤 - 請注意,您使用的readline,其中程序似乎預計一次讀取文件中的所有行。一種方法是使用readlines。該程序還必須從readlines收集這些行 - 這裏將它們存儲在名爲lines的列表中。爲了收集標籤,程序循環遍歷每一行,將其拆分爲,,並將第一個元素附加到標籤爲labels的數組。

在第二部分,程序讀取csv2.csv中的所有行,同時還打開寫入輸出文件csv.out。它逐行處理從csv2.csv開始的行,同時將目標文件寫入輸出文件。

爲此,程序再次將每行分割,,並查看在labels數組中是否找到csv2中的標籤。如果是,則該行寫入csv_out.csv

+0

完美的方法和解釋!謝謝@atru! –

+0

不客氣,添加了一些更多的解釋,以防萬一:) – atru

0
  • 嘗試使用pandas,它是一種非常有效的方法,可以將csv文件讀取到名爲dataframe的數據結構中。

編輯

labels = [] 
with open("csv1.csv", "r") as f: 

    f.readline() 
    for line in f: 
     labels.append((line.split(',')[0]) 

with open("csv2.csv", "r") as f: 

    f.readline() 
    for line in f: 
     if (line.split(",")[0]) in labels: 
      print (line) 

我就使標籤只包含這樣['aaa','bbb', etc]

那麼你一定要檢查是否line.split(",")[0]是在標籤的字符串的第一部分

既然你想要僅基於第一列進行匹配,則應使用拆分,然後從索引爲0的拆分中獲取第一個項目。

+0

我改變了它,但仍然不起作用。 –

+0

哦,我的壞,我誤解爲拆分。我認爲你應該改變它分裂。閱讀我的編輯 – Samantha