2016-08-10 17 views
3

の欠損値を置き換えるあなたはこのような形式の入力があるとします。最初の項目:4 '_'は、これまでのところ'/t'は、入力のPython

ことになっている

id____value1____value2...valueN 
1____hello____world...something 
2________goodnight...world 

、私はこのような何かを得ます{ID:2, value1:n/a , value2:goodnight, ... , valueN: world}

私はSCRI書かれている:2つ目の項目は{ID:2, value1: , value2:goodnight, ... , valueN: world} が、私は2番目の項目のための私の最終的な表現を可能にしたい持っているのに対し、{ID:1, value1:hello, value2:world,...,valueN:something}ありptを使用してファイルを1行ずつ読み込みますが、'/t'の後にもう1つの'/t'があるかどうかを確認してから、'n/a'の値を挿入したいと考えています。

def myFunc(): 
    list = [] 
     with open(file, 'r') as f: 
      header = f.readline() # Store the header of the file for future reference.(maybe). Don't commend out. 
      for line in f: 
       for i in range(len(line)): 
        if line[i] == '\t': 
         if line[i+1] == '\t': 
          line[:i] + "n/a" + line[i:] 
       list.append(line) # iterate through the file and store it's values on the list. 
     return list 

答えて

3

一日の終わりにリストをどのように使いたいかに応じて、csvモジュールを使用して、何も入力しないで複数の列が来る可能性がある場合は少し柔軟になります。今

import csv 

with open(file, 'r') as f: 
    reader = csv.reader(f, delimiter='\t') 
    header = next(reader) 
    list = [[x if x else 'n/a' for x in line] for line in reader] 

listは、実際の項目が含まれ、それぞれが、リストのリストになります。

In [11]: print(header) 
['id', 'value1', 'value2', 'value3'] 

In [12]: print(list) 
[['1', 'hello', 'world', 'something'], ['2', 'n/a', 'goodnight', 'world']] 

編集以下のコメントの後に追加:

あなたの辞書を着陸する予定(Pythonの2.7以降の辞書内包表記を使用して)上記の方法をわずかに変更。これはクリーンであるかどうか

import csv 

with open(file, 'r') as f: 
    reader = csv.reader(f, delimiter='\t') 
    header = next(reader) 
    list = [{header[i]: line[i] if line[i] else 'n/a' for i in range(len(header))} for line in reader] 

print(list) 
# [{'value1': 'hello', 'value3': 'something', 'id': '1', 'value2': 'world'}, {'value1': 'n/a', 'value3': 'world', 'id': '2', 'value2': 'goodnight'}] 

あなたが聞いて、これはおそらくあなたがラインの下の結果を使用する方法についてのかなり依存します。ディクショナリアプローチは、結果を検査することを決定した場合、読みやすいものを提供します。

ファイルに多数のデータマングリングを実行する必要がある場合は、このような種類のデータ構造のpandasDataFrameに興味があります。あなたがそのような状況にない場合、そのアプローチはちょうど完全に過度のかもしれません。それが何をするかの簡単な例(それはデフォルトであなたの元'n/a'問題の世話をすることに例えば注意してください)のカップル:

In [1]: import pandas as pd 

In [5]: df = pd.read_csv('testfile', delimiter='\t') # Or whatever your file is called 

In [6]: df = df.set_index('id') 

In [7]: df 
Out[7]: 
    value1  value2  value3 
id 
1 hello  world something 
2  NaN goodnight  world 

In [8]: df[df['value3'] == 'something'] # Find all rows with a given value3 
Out[8]: 
    value1 value2  value3 
id 
1 hello world something 

In [10]: df[df['value2'] == 'goodnight'] # Find all rows with a given value2 
Out[10]: 
    value1  value2 value3 
id 
2  NaN goodnight world 

In [11]: df['value1'] # Show only value1 
Out[11]: 
id 
1 hello 
2  NaN 
Name: value1, dtype: object 

は基本的にあなたが思い付くことができ、テーブル上の任意の操作がpandasで自然なアプローチを持っています。

+0

これは実際に本当に役に立ちます!どうもありがとう!それが辞書のリストだったら、これはもっときれいではないでしょうか?私はこれは私がPythonには本当に新しいので、依頼して、まだ基本を把握しようとしています。 – Pavlos

+0

あなたは、上記のコメントを読んで、あなたに意見をくれますか?それはもっときれいでしょうか? – Pavlos

+0

@Pavlos:私は答えに少し追加しました。 – fuglede

1

なぜreplace

私のコードは、これまでのところ、このですか?

for line in f: 
    line.replace('\t\t','n/a') 

Anywhereは隣接する二つの\t値がある、あなたの代わりに 'N/A' になります。 @DeepSpaceが指摘しているように、fは実際には変更されていないので、リストに行を追加するか、結果を追跡するために何かをしなければなりません。

+0

良い。 'replace'は新しい文字列を返すので、' line = line.replace( '\ t \ t'、 'n/a') 'でなければなりません。また、このコードは 'f'の行を実際に変更しないことに注意してください。 – DeepSpace

+0

'line.replace( '\ t \ t'、\ tn/a \ t ')'になります。しかし、私はそれを行こう! – Pavlos

+0

ありがとう、皆さん! – Pavlos