2016-05-03 7 views
2

私はそれらの特定の列だけが必要ですが、混合情報を含むファイルを持っています。特定の値を選択してから出力する

以下は私のサンプルファイルです。

A B C D  
1 2 3 abcdef 
5 6 7 abcdef 
1 2 3 abcdef 

私は必要な情報を得るためにファイルを抽出したいと思います。たとえば、私の出力ファイルでは以下のようになります。

A C D  # I only need A, C, and D column. 
1 3 ab  # For D column, I only need ab. 
5 7 ab  
1 3 ab 

これはcsvまたはtxtファイルではなく、各列間にスペースを入れたものです。

+2

それがテキストファイルでない場合は、どのような種類ファイルですか? – wim

+0

私はOPがフォーマットではなく拡張について話していると思います。 –

答えて

6

あなたはまだ区切りkwargを使用してCSVモジュールとスペースで区切られたファイルを読むことができます:あなたがデータ構造を管理するためのgenerical何かをしたい場合は、あなたが行うことができます最も簡単な方法は、使用のpythonライブラリです

>>> with open('/tmp/data.txt') as f: 
... reader = csv.DictReader(f, delimiter=' ') 
... for row in reader: 
...  print row['A'], row['C'], row['D'][:2] 
...   
1 3 ab 
5 7 ab 
1 3 ab 
+0

ありがとうございます。しかし、列Dのような何百もの列を選択する必要がある場合、選択基準は同じです(つまり[:2])。 – BigSecrect

+1

これらの列のリストを作成してループしてください。 – wim

1

を仕事を楽にする

Pandas Lib:Python Data Analysis Libraryを使用すると、ファイルを素早く解析して、目的の方法を提供するDataFrameにすることができます。

as_matrixメソッド(下記)がnumpyArrayを返すので、Numpyライブラリも必要です。

セパレータとして空白を含むcsv(カンマ区切り値)ファイルとしてデータファイルを見ることができます。あなたはas_matrixメソッドを使用する列を選択するための

import pandas as pd 
import numpy as np 
dataFrame = pd.read_csv("file.txt", sep = ' ') 

selection = dataFrame.as_matrix((A,C,D)) 

その後、あなたはおそらく継続するDATAFRAMEに戻って、それをキャストすることができますしたいあなたは簡単にread_csvでファイルを解析することができ、PDで

そのメソッドを使用して:

newDataFrame = pd.DataFrame(selection) 

"abcdef"値の "cdef"を削除する列Dの中には、の単純なと、Pythonが提供する[String] [5]の方法で解決できるもののように見えます。その非常に特定の指示と私はこれを達成するライブラリの実装されたメソッドを知りません。

私はあなたを助けたと思います。

PD:私はリンクをたくさん投稿しようとしましたが、システムは私をさせませんでした。私はあなたがそれらを持っていない場合Googleにナンシーとパンダを探すことをお勧めします。 pandas DataFrameドキュメントをチェックしてメソッドを確認する必要があります。私は、あなたがGoogleでpandas.read_csv、pandas.dataFrame.as_matrix docsを探すのをあなたが理解できなかった場合です。

文字列を操作する方法がわからない場合は、Pythonのドキュメントで文字列を調べます。

編集:とにかく、あなたがライブラリを使用したくない場合は、マトリックスを模倣するリストの一覧にtxtファイルを解析したり、その答えにwimが言及しているcsv構造体を使用したりできます。次に列を削除する関数を作成し、各列の最初の要素(列識別子)をチェックし、の場合はを他の行列にエクスポートします。

次に、の別のを使用して、列の目的の値を削除する別の関数を作成します。

要点は、目的を達成するために関数を使用すると、マトリックスとして管理されているすべてのテーブルに対してソリューションが一般的になります。

1

あなたはDのような複数の列を持つとDと同じことをしたい場合は、インデックスの代わりの文字で列を選択して[OK]をしている場合、あなたは以下のことが可能です。

# your data like this 
A B C D E 
1 2 3 abcdef abbbb 
5 6 7 abcdef abbbb 
1 2 3 abcdef abbbb 

あなたimport csvその後、

>>> with open('yourdata.txt') as f: 
...  reader = csv.reader(f, delimiter=' ') 
...  for row in reader: 
...   print(row[0], row[1], *[c[:2] for c in row[3:]]) 
... 
A B D E 
1 2 ab ab 
5 6 ab ab 
1 2 ab ab 

[c[:2] for c in row[3:]]*オペレータは、開梱list引数のためです。 *[1,2,3]を基本的に1,2,3に変換するので、print(*[1,2,3])print(1,2,3)と同じです。タプルでも動作します。

ただし、これはpython3です。あなたはpython2を使用している場合は、printはあなたに、構文エラーになりますが、あなたはアンパックリスト引数に取るラッパー関数を作成し、この機能をprintを置き換えることができます。

def myprint(*args): 
    print ' '.join([str(i) for i in args]) 
+0

ありがとうございますが、 'タプルを検出中に構文エラーが発生しました'というエラーメッセージが表示されます。なにか提案を? – BigSecrect

+1

@BigSecrect私はpython3を使用していて、Python 2.7を使用していることに気付きました。印刷が異なる動作をし、リストのアンパックは関数引数でのみ使用できます。だからこれはちょっと残忍かもしれませんが、 'def p(* args):print '' .join([argsのiのためにstr(i)]') 'print'部分をこの関数に置き換えてください。 – neilxdims

関連する問題