2017-11-06 7 views
1

私はPython 3を学んでいます。私は自分自身を初心者だと思っています。特定の間隔でテキストファイル(python)に再帰的にスペースを追加する方法はありますか?

問題は、できる限り簡単に言えば、.txtファイルにスペースを追加しようとしています。それは簡単に聞こえるが、それは私を困らせた。

だから私はワシントンダブルスターカタログと呼ばれる二重星のこの巨大なテキストファイルとその座標を持っています。ダウンロードすると、30084行のテキストを含むテキストファイルが生成されます。私は一貫して各行に10文字のスペースを入れ、次の2-4行の後に条件付きで空白を削除する必要があることを知っています。例えば

05597+2228STT 125  1843 2007 33 2 0 1.3 1.4 7.89 8.89 A0  -017-003 -017-003 +22 1130  055942.46+222815.0 

挿入空間が「8」と「S」との間であろうため

このような状況では、 "T"と "125"の間の空白も削除する必要があります。

各行を再帰的に編集する方法を知ったら、おそらく空白の条件付き書式設定を処理できます。私はそれが関数とループと関係しなければならないことを理解しています。私はまた、ファイルを読むためにPythonを手に入れています。

これを実行しようとしている主な理由は、WDS識別子と発見者コードの間に空白がないとインポートが上がらないため、Excelにエクスポートすることです。

アドバイスをいただければ幸いです。

ありがとうございました。

答えて

0

指定した場所にスペースを挿入することはできますが、それは悪い戦略だと思います。たとえば、空のフィールドは空白で表されるため、空でない場合は正常に読み込まれますが、空の場合は隣接するフィールドとマージされます。また、あなたが言及するもの以外の内部空間を含むことができる他のフィールドがあります。

もっと良いアプローチは次のようなものです:WDS Bible format codesに基づいて行を個々の文字列に分割します。最初から空白を取り除き、これらの文字列を削除します。内部スペースをアンダースコア(_)で置き換えます。データをタブ区切りに戻します。

以下はこれを実装したものです。私の「Xnの」コードは、WDS形式で空きスペースを表します。

私のシステムで
import re 
import sys 

FORMAT_CODES = [ \ 
    'A10', 'A7', 'A5', 'X1', 'I4', 'X1', 'I4', 'X1', 'I4', \ 
    'X1', 'I3', 'X1', 'I3', 'X1', 'F5.1', 'X1', 'F5.1', \ 
    'X1', 'F5.2', 'X1', 'F5.2', 'X1', 'A9', 'X1', 'I4', \ 
    'I4', 'X1', 'I4', 'I4', 'X1', 'A8', 'X1', 'A4', 'X1', 'A18', \ 
] 

def format_length(fmt): 
    match_object = re.match(r'[A-Z](\d+)', fmt) 

    assert match_object is not None 

    return int(match_object.group(1)) 

format_lengths = [format_length(code) for code in FORMAT_CODES] # optimization 

with open(sys.argv[1]) as catalog: 
    for line in catalog: 
     start = 0 
     data = [] 

     for index, code in enumerate(FORMAT_CODES): 
      stop = start + format_lengths[index] 

      if not code.startswith('X'): 
       string = line[start:stop] 
       data.append(string.strip().replace(' ', '_')) 

      start = stop 

     print(*data, sep='\t') 

は、このコードを手動で非データをはがした後、約2秒で30Kライン00から06時間のセクションを処理することができましたヘッダー行。