2017-03-05 15 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] != "?"):は常にtrueです。それが0であるとすれば、確かにそうではありませんか? orのいずれかの条件が常に成立します。このコードは、他の理由でクラッシュするまで行を出力します(下記参照)。だから、あなたの最初の問題は、あなたが実際にメソッドを呼び出さないということです。

次に、行インデクサーiを1行につき1つインクリメントしているため、1行目のセル0、2行目のセル1が読み込まれ、最終的にiが大きくなるとインデックスエラーが発生します。列の数よりも多い。あなたが望むものを実際にやっているわけではなく、行ごとに1つのセルしかチェックしていません。

制限交差文字を使用して、制限された文字がいずれかのセルに含まれているかどうかを調べることができます。そのセルが制限された文字のいずれかと正確に等しくなければならないかどうかは私にはっきりしていないので、この例を書いて、その行を検査のための単一の文字列に結合することによって、

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

それは私のために働く。あなたは 'print( 'ファイルの入力パスを入力してください:')'ファイル名を 'sys.argv'から取得します。たぶんあなたが思っている場所にファイルがないだけかもしれません。この例をより多くのプリントで更新します。 – tdelaney

+0

ありがとうございます。これは役に立ちます! – user6622569

関連する問題