2017-08-14 5 views
1

私は.txtファイルに特別な区切り文字を付けずに解析するために、文字の開始位置と終了位置を知る必要があります。そうするために、私はキーがカラム名と値が各列とるの文字数されているPythonの辞書の構築:このことを念頭に置いを持つPython辞書とPandasを使用して固定構造を持たないテキストファイルを解析する

headers = {first_col: 3, second_col: 5, third_col: 2, ... nth_col: n_chars} 

を、私は知っていることの3つの第1列.txtファイルの行を次のよう

ABC123-3YN0000000001203ABC123*TESTINGLINE 

first_col:ABC second_col:123-3 third_col:YN

私は私がこの.TXTの撮影を解析することができます任意のパンダの機能があるかどうかを知りたいですaccoにこの特別な条件と(可能であれば)headers辞書を使用してください。

答えて

1

辞書を使用すると、その順序が保証されないため危険です。意味、あなたが最初にthird_colを選んだ場合、あなたはあなたの全体の計画をスローしました。リストを使ってこれを修正できます。そこから、pd.read_fwfを使用して、固定形式のテキストファイルを読むことができます。

ソリューション

names = ['first_col', 'second_col', 'third_col'] 
widths = [3, 5, 2] 

pd.read_fwf(
    'myfile.txt', 
    widths=widths, 
    names=names 
) 

    first_col second_col third_col 
0  ABC  123-3  YN 

あなたはまた、collectionsライブラリからOrderedDictを使用して、正しい順序

from collections import OrderedDict 

names = ['first_col', 'second_col', 'third_col'] 
widths = [3, 5, 2] 

header = OrderedDict(zip(names, widths)) 

pd.read_fwf(
    'myfile.txt', 
    widths=header.values(), 
    names=header.keys() 
) 

    first_col second_col third_col 
0  ABC  123-3  YN 

でタプルを生成イテレータを渡すことで、必要な秩序を維持することを確認することができますデモ

from collections import OrderedDict 

txt = """ABC123-3YN0000000001203ABC123*TESTINGLINE""" 

names = ['first_col', 'second_col', 'third_col'] 
widths = [3, 5, 2] 

header = OrderedDict(zip(names, widths)) 

pd.read_fwf(
    'myfile.txt', 
    widths=header.values(), 
    names=header.keys() 
) 

    first_col second_col third_col 
0  ABC  123-3  YN 
+0

io.common.StringIOはhttps://docs.python.org/2/library/stringio.html#module-cStringIOよりも優れていますか? –

+0

また、「OrderedDictコンストラクタとupdate()メソッドは両方ともキーワード引数を受け入れますが、Pythonの関数呼び出しセマンティクスは正規の順序付けられていない辞書を使ってキーワード引数を渡すため、その順序が失われます。 –

+0

「StringIO」に関して、私はどんな主張をしているのかは分かりません。私は 'pd.io.common'を使用しました。あなたがすでにインポートしていることが分かっているからです。 – piRSquared

関連する問題