2017-09-07 36 views
0

請查看我的示例代碼。我的input.csv中的State0是1101,state1是1100,state2是100.我想在輸出中寫入一行,每行將從第[2]行中選擇一個代碼。像ID 1一樣,它應該選擇23456並寫入,從ID 2選擇45632並寫入,從ID 3選擇31276並寫入。我想用每個ID的全部三個代碼寫一行。目前在執行代碼後,我得到ID爲23456的正確ID爲234456,這是錯誤的。它應該是45632,並且對於ID 3,它正在寫入31276的正確值。我想爲每個ID編寫第一個代碼。 Out.CSV預計結果在CSV上過濾出唯一的行

import csv 
import glob 

search_string = 'CAT' 
state0 = '1101' 
state1 = '1100' 
state2 = '100' 
corner1 = "TM" 

with open("out.csv") as sample: 
    reader = csv.reader(sample,delimiter="\t") 
    header = 'ID', 'Code', 'state' 

with open("out1.csv", "wb") as out1: 
    writer = csv.writer(out1) 
    writer.writerow(header) 

    for path in glob.glob("out.csv"): 
     if path == "out1.csv": continue 
     with open(path) as fh: 
      reader = csv.reader(fh) 
      for row in reader: 
       if corner1 in row: 
        if search_string in row: 
         if state0 in row: 
          readers = list(row) 
          readers.append(row[2]) 
         elif state1 in row: 
          readers1 = list(readers) 
          readers1.append(row[2]) 
         elif state2 in row: 
          readers2 = list(readers1) 
          readers2.append(row[2]) 
          print(readers2) 
          writer.writerow(readers2) 
          break 

Input.CSV

ID Code state 
1 23456 1101 
1 34567 1101 
1 12354 1101 
2 45632 1100 
2 56798 1100 
2 23412 1100 
3 31276 100 
3 98065 100 
3 26987 100 

Out.CSV(預期)

ID Code state   
1 23456 1101 23456 45632 31276 
+0

可以縮短你的解釋,並提供一個[MCVE]。我覺得你離那不太遠,但是想想別人沒有1小時閱讀你的文字。 –

+0

我剛編輯我的問題。感謝您的建議。 –

+0

更好,但代碼並不完整(我們只能看到循環),而且還不清楚csv是什麼:您得到的結果或預期的結果? [mcve]需要一些額外的工作。 –

回答

0

這是很難解決您嘗試的中斷邏輯,但它的容易用正確的邏輯編寫一些清晰的代碼,所以我會詳細解釋我的代碼。

您的預計產量爲

title 
full_first_row code1 code2 code3 

您需要:

  • list的最後一行寫
  • set記住哪個ID已經被遇到

我只是讀取行並檢查如果行ID已經在set。如果不在set中存儲ID,則下次顯示時不能計入。

如果id是1,則複製輸出list中的整行。之後,將代碼附加到此列表中。

從輸入文件中複製標題後,編寫由此(奇怪)數據組成的唯一行。

找到它採用了內置的列表,而不是輸入文件的自包含下面的例子,但它很容易通過一個實際的文件句柄來代替input_csv

input_csv = """ID Code state 
1 23456 1101 
1 34567 1101 
1 12354 1101 
2 45632 1100 
2 56798 1100 
2 23412 1100 
3 31276 100 
3 98065 100 
3 26987 100""".splitlines() 

import csv 

with open("out.csv","w",newline="") as output_csv: 
    cw = csv.writer(output_csv,delimiter="\t") 
    cr = csv.reader(input_csv,delimiter="\t") 
    cw.writerow(next(cr)) # write title 
    found_ids = set() 
    row_to_write = [] 
    for row in cr: 
     if row: 
     the_id = row[0] 
     if not the_id in found_ids: 
      found_ids.add(the_id) 
      if the_id=='1': 
       row_to_write += row 

      row_to_write.append(row[1]) 
    cw.writerow(row_to_write) 
+0

預期輸出與輸入中的標題相同,並且輸入中的第一行是ID 1行,然後爲該行中的每個ID編寫代碼。像所有三種代碼一樣。請看下面。 –

+0

好的,我真的認爲有一個錯字。這並沒有太大的改變。編輯。我得到預期的輸出結果,並得到一個完全重寫的代碼,因爲我沒有得到你嘗試的破壞邏輯。 –

+0

高度讚賞它。執行上面的腳本後,我得到的錯誤是row_to_write.append(行[1]),列表索引超出範圍。對此有何評論? –