2017-03-05 174 views
0

我是python的新手,正在嘗試讀取csv輸入和輸出文件,按每行掃描輸入文件,並僅將那些行寫入輸出沒有任何特殊字符的文件,如'?'或'0'。以下是我的代碼:python從命令行讀取csv文件並將輸出寫入output.csv

import csv 
import sys 
class PreProcessDataSet: 
    def preProcessData(self) : 
     print ('Enter the input path of the file : ') 
     inputFile = open(sys.argv[1], 'rb') 
     outputFile = open(sys.argv[2],'wb') 
     writer = csv.writer(outputFile) 
     i = 0 
     for row in csv.reader(inputFile): 
      if (row[i]!="0" or row[i] != "?"): 
       writer.writerow(row) 
       i=i+1 
       print row 

此代碼不會給出任何輸出。有人能幫我解決嗎?

+0

您在此處定義一個類。也許你不是故意的,但我沒有看到實際的電話。你錯過了嗎?如果不是,你可以分享嗎?此外,有點奇怪,像這樣調用sys.argv [1]。你是否想要從控制檯讀取它? –

回答

0

您的狀態if (row[i]!="0" or row[i] != "?"):始終爲真。假設它是0,那麼它肯定不是?所以or條件之一總是通過。這段代碼應該打印行,直到出現其他原因崩潰(見下文)。所以,我認爲你的第一個問題是你實際上沒有調用這個方法。

接下來,您每行增加一列索引器i一次,因此它將讀取第一行的單元格0,第二行的單元格1 ......並且最終當i變大時,您將收到索引錯誤比列的數量。它並沒有真正做到你想要的,它只檢查每行一個單元。

您可以使用set交集來確定受限字符是否在任何單元格中。我不清楚單元格是否必須完全等於其中一個限制字符,所以我編寫了這個示例,通過將行連接到單個字符串進行檢查來查找行中的任何事件。

import csv 
import sys 

class PreProcessDataSet: 
    def preProcessData(self) : 
     special_chars = set('?0') 
     # Don't tease the user with prompts that don't work! 
     # print ('Enter the input path of the file : ') 
     inputFile = open(sys.argv[1], 'rb') 
     outputFile = open(sys.argv[2],'wb') 
     print "Converting", inputFile, "to", outputFile 
     writer = csv.writer(outputFile) 
     for row in csv.reader(inputFile): 
      if not set(''.join(row)) & special_chars: 
       writer.writerow(row) 
       print row 


obj = PreProcessDataSet() 
obj.preProcessData() 

樣品運行:

~/tmp $ cat infile.csv 
one,two,three 
0,four,five 
six?,seven,eight 
nine,ten,eleven 
~/tmp $ python test.py infile.csv outfile.csv 
Converting <open file 'infile.csv', mode 'rb' at 0x7f9d4d0165d0> to <open file 'outfile.csv', mode 'wb' at 0x7f9d4d016660> 
['one', 'two', 'three'] 
['nine', 'ten', 'eleven'] 
~/tmp $ cat outfile.csv 
one,two,three 
nine,ten,eleven 
+0

謝謝你的回答。還有限制字符0或?如果不存在,則不應寫入輸出文件。而且,這段代碼並不真正寫入輸出文件。你能幫我解決嗎? – user6622569

+0

它適合我。你打印('輸入文件的輸入路徑''),然後從'sys.argv'中獲取你的文件名。也許這些文件不會在你認爲他們應該做的地方。我會用更多的印刷品來更新這個例子。 – tdelaney

+0

非常感謝。這有幫助! – user6622569

相關問題