2016-03-31 16 views
0

大きなタブ区切りのCSVファイルから特定の列を選択し、特定の列のみを新しいCSVファイルに出力しようとしています。さらに、私はこのようにデータを再コード化したい。セルが0の値を有する場合には、単に0を出力する。しかし、セルが0より大きい値を有する場合、出力1だけ(すなわち、0より大きいすべての値は1として符号化される)。ここで1つのCSVファイルから別のCSVファイルへの書き込みと再コード

は、私がこれまで持っているものです。

import csv 

outputFile = open('output.csv', 'wb') 
outputWriter = csv.writer(outputFile) 
included_cols = range(9,2844) 

with open('source.txt', 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    for row in reader: 
     content = list(row[i] for i in included_cols) 
     outputWriter.writerow(content) 

私が午前最初の問題は、私は私が6列を記述する方法がわからなかったし、その後の列の9-も、カラム6から撮りたいということです2844。

第2に、私は新しいCSVを書くときに、その場で記録を行う方法がわかりませんでした。

答えて

0

私はカラム6を書いてからカラム9-2844を書く方法がわかりませんでした。

included_cols = [6] + list(range(9,2844)) 

you can add two lists togetherので、これは動作します。 Python3では、rangeはリストを返さないので、それを強制する必要があることに注意してください。 1 if row[i] > 0 else 0

私はこれが原因 conditional expressionの作品フライ

content = list((1 if row[i] > 0 else 0) for i in included_cols) 

に再符号化を行う方法がわかりませんでした。一般的な形式A if cond else Bは、条件に応じてAまたはBのいずれかに評価されます。

"too clever by half"と思われる別のフォームはcontent = list((row[i] and 1) for i in included_cols)です。これは、and operatorが常に入力の一方または他方を返すために機能します。

+0

を「1」に行全体を書き直すように思わ上記の回答と同様。私はただ一つの細胞を '1'に再コードすることを考えていました。 – Matt

+0

最初の列がリストのインデックス0にあるので、 'included_cols = [5] + range(8、2844)'でなければいけませんか? – user2676699

0

これは動作するはずです:

import csv 

outputFile = open('output.csv', 'wb') 
outputWriter = csv.writer(outputFile) 
included_cols = [5] + range(8,2844) # you can just merge two lists 

with open('source.txt', 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    outputWriter.writerow(reader[0]) # write header row unchanged 
    for row in reader[1:]: # skip header row 
     content = [int(row[i]) if i == 5 else (0 if int(row[i]) == 0 else 1) for i in included_cols] 
     outputWriter.writerow(content) 
+0

他のコードと同様に、行全体を '1'に再コード化しているようです。私はただ一つの細胞を '1'に再コードすることを考えていました。 – Matt

+0

行内のアイテムはすでに整数に変換されているのですか、それとも数値を表す文字列ですか?それらが文字列の場合、intへの変換を追加しました。文字列と0との変換の比較がなければ、常にfalseと評価されます。 – apr

+0

リストの最初の列がインデックス0にあるので、 'included_cols = [5] + range(8、2844)'ではありませんか? – user2676699

関連する問題