2014-09-02 38 views
-2

我的代碼從csv文件中提取數據。我想爲它添加一個標題。我很困惑把print語句放在哪裏,所以它會在文件的開頭(作爲頭文件)。爲Python中的每個if語句創建單獨的標題

import csv 
import StringIO 

f = open('/home/unica/app/Affinium/Campaign/partitions/partition1/scripts/runscripts/campaigns/cnyr/dev/output/CNYR_DM_TM_CAMPAIGN_WAVES.csv', 'r') 

try: 
reader = csv.reader(f, delimiter='|', quotechar='"') 
for row in reader: 
if row[16] == "" and row[5].find('_NOEMAIL_'): 
    if row[6]== 'DM': 
     print('PRINT_PUB_CODE,PRINT_ACCT_NUM,CO_NAME,... 
     print( row[17]+'|'+row[16]+'|'+row[25]+'|'+row[18]+'|'+row[20]+'|'.... 
    elif row[6]== 'TM': 
     print('PRINT_PUB_CODE,PRINT_ACCT_NUM,CO_NAME,... 
     print( row[17]+'|'+row[16]+'|'+row[25]+'|'+row[18]+'|'+row[20]+'|'.... 

有多個if語句,我想標題,我以後把它如果和打印這我得到了rows.The結果之前,每個case.So之前

PRINT_PUB_CODE,PRINT_ACCT_NUM,... 
,J,8,,NUSRALA,,EDWARD... 
PRINT_PUB_CODE,PRINT_ACCT_NUM,... 
,J,614,,BACAL,,LEON... 

所以我肯定沒有要求這樣看來,它是csv文件中的每一行searchng,並返回「PRINT_PUB_CODE,PRINT_ACCT_NUM,...」每次循環結束。任何想法如何解決這個問題。

的CSV文件看起來像這樣

SEQ_NUM|ICS_ORIG_STRT_DT|EDW_FIRST_OUT_IFP_DT|... 
119|20140602|00010101|20140818|0|21... 
119|20140602|00010101|20140818|0|21... 

另外,O/P我想是這樣的

PRINT_PUB_CODE,PRINT_ACCT_NUM,... 
,J,8,,NUSRALA,,EDWARD... 
,J,614,,BACAL,,LEON... 
+1

請修復您的縮進;要麼擺脫'try'或者添加相應的'except'或'finally';修正流浪的報價和失蹤的遺物;等等。您向我們展示的代碼實際上不會運行,甚至不會編譯,並且遠不是[MCVE](http://stackoverflow.com/help/mcve)。 – abarnert 2014-09-02 18:27:11

+0

@abarnett它運行併爲我提供了我不同意的輸出。請不要擔心縮進。請幫助我理解它爲什麼會發生。 – Rajarshi 2014-09-02 18:30:02

+0

@Rajarshi:幫助我們幫助你... – martineau 2014-09-02 18:30:50

回答

0

for循環之前就打印頭:

reader = csv.reader(f, delimiter='|', quotechar='"') 
print(my_header) 
for row in reader: 
    do_stuff(row) 

如果標題基於CSV文件的第一行,請分別讀取第一行:


同時,如果您需要讀取文件的csv模塊,你幾乎肯定需要一個用於寫出處理的版本,如果它的csv模塊。否則,你將打破第一個要求csv模塊的完全相同的引用,轉義等。

而且,即使您實際上並不需要它,它也會使您的代碼變得更加簡單。

例如,查找在每個這兩行的錯誤:

print( row[17]+'|'+row[16]+'|'+row[25]+|'+row[18]+'|'+row[20]) 

writer.writerow((row[17], row[16], row[25, row[18], row[20])) 
+0

ty.I跳入python,所以如果你可以解釋一點點。對我來說頭是打印('PRINT_PUB_CODE,PRINT_ACCT_NUM,CO_NAME,...我想包括它在每個if語句之前。因此,當那個特定的if語句符合我的數據時,它將返回具有特定打印語句的數據。希望它有幫助。 – Rajarshi 2014-09-02 18:35:14

+1

@Rajarshi:我認爲在閱讀描述之後,我比以前更瞭解你的問題。正是我們爲什麼需要一個[MCVE](http://stackoverflow.com/help/mcve)編輯你的問題給我們一個精簡的例子,它帶有輸入,所需輸出和實際輸出,然後我們可以告訴你如何改變它,沒有它,我們只是在猜測。 – abarnert 2014-09-02 18:53:23

+0

剛剛更新all.if任何你需要讓我知道。 – Rajarshi 2014-09-03 13:44:08

1

在打印它爲每一個循環迭代。嘗試將它移到for語句之前。

print('PRINT_PUB_CODE,PRINT_ACCT_NUM,CO_NAME,... 
for row in reader: 
    if row[16] == "" and row[5].find('_NOEMAIL_'): 
     if row[6]== 'DM': 
      print( row[17]+'|'+row[16]+'|'+row[25]+'|'+row[18]+'|'+row[20]+'|'.... 
     elif row[6]== 'TM': 
      print( row[17]+'|'+row[16]+'|'+row[25]+'|'+row[18]+'|'+row[20]+'|'.... 
+0

更正它爲每個迭代打印,但每個if語句的print語句是不同的,並且我有它們的多個。因此,當特定的if語句符合我的數據時,它將返回頂部的特定打印語句的數據的。 – Rajarshi 2014-09-02 18:39:07

+0

@Rajarshi所以你想要一旦到達每一行就停下來?如果是這樣,你可能正在尋找'break'。 – rbonick 2014-09-02 20:46:06

+0

我試過把break和continue.ans也放在我的打印語句與標題打破並continue.Still它正在printing.The代碼正在運行。 if row [12] =='DM':break print('PRINT_PUB_CODE,PRINT_ACCT_NUM ... continue print(row [17] +','+ row [16] +','... – Rajarshi 2014-09-02 21:26:53