2017-02-04 3 views
1

私のテキストは、このように配置されているmlt.ctlファイルがあります:newmlt.ctlファイル内の目的の形式を保存する必要がctlファイルのテキストを水平方向に垂直方向に連結し、pythonを使用して新しいctlファイルに保存する方法は?

znrmi_001/znrmi_001_001 
znrmi_001/znrmi_001_002 
znrmi_001/znrmi_001_003 
zntoy_001/zntoy_001_001 
zntoy_001/zntoy_001_002 
zntoy_001/zntoy_001_003 
zntoy_001/zntoy_001_004 
....................... 
zntoy_001/zntoy_001_160 
.................... 
zntoy_002/zntoy_002_001 
zntoy_002/zntoy_002_002 
....................... 
zntoy_002/zntoy_002_149 

を、目的の形式を以下に示します。

znrmi_001 znrmi_001_001 znrmi_001_002 znrmi_001_003 
zntoy_001 zntoy_001_001 zntoy_001_002..................zntoy_001_160 
zntoy_002 zntoy_002_001 zntoy_002_002..................zntoy_002_149 
.................................................................... 

私はPythonで頑張っていますが、毎回エラーが発生しています。

elifエラーが発生していて、コードが正しく実行されていないため、入力してください。

+0

すでにニコライShmyrev @ –

+0

を試してみましたが、親切に上記のコードで入力を提供するどのようなコード。 – Andy

答えて

1

正規表現を使用して辞書にマッチを保存:

import re 

REGEX = r"\d.\s(\S+)/(\S+)" # group 1: the unique index; group 2: the value 
finder = re.compile(REGEX) # compile the regular expression 

with open('mlt.ctl', 'r') as f: 
    data = f.read() # read the entire file into data 

matches = re.finditer(finder, data) # find all matches (one for each line) 

d = {} 
indices = [] 
for match in matches: # loop through the matches 
    key = match.group(1) # the index 
    val = match.group(2) # the value 

    if key in d.keys(): # the key has already been processed, just append the value to the list 
     d[key].append(val) 
    else: # the key is new; create a new dict entry and keep track of the index in the indices list 
     d[key] = [val] 
     indices.append(key) 


with open("newmlt.ctl", "w") as out: 
    for i, idx in enumerate(indices): 
     vals = " ".join(d[idx]) # join the values into a space-delimited string 
     to_string = "{} {}\n".format(idx,vals) 
     out.write(to_string) 
+0

正しい出力が得られますが、ゼロから始まるシリアル番号も与えられます。 0 znrmi_001 znrmi_001_001 znrmi_001_002 znrmi_001_003のように、文字列の先頭でシリアル番号を削除する方法。 – Andy

+0

私は答えを編集しました。 'to_string'行を' to_string = "{} {} \ n" .format(idx、vals) 'に変更するだけで、開始時にインデックスが表示されなくなります。 – Crispin

+0

トレースバック(直近の最後の呼び出し): 行28、 to_string = "{} {} {} \ n" .format(idx、vals)IndexError:タプルのインデックスが範囲外の値 – Andy

0

は多分それが関連しますが、11

y = a1+ " ".join(line[20:23].split() 

y = a1+ " ".join(line[20:23].split()) 

とする必要があり、あなたがライン上に ')' を忘れているようだされていません ':' で行14でelsefor(行20)

また、12行目では文字列と整数を比較することになります。

1

もう少しニシキヘビ:

from collections import defaultdict 
d = defaultdict(list) 
with open('mlt.ctl') as f: 
    for line in f: 
     grp, val = line.strip().split('/') 
     d[grp].append(val) 
with open('newmlt.ctl','w') as f: 
    for k in sorted(d): 
     oline = ' '.join([k]+d[k])+'\n' 
     f.write(oline) 
+0

を参照してください。ただし、順序は変更されます。 – Andy

+0

@Andyは、ファイルがソートされていると考えました。キーの順序を保持したい場合は 'keys = []'リストを用意して、入力ループ 'キーでない場合:keys.append(grp)'でそれらを収集してください。出力ループでキーの繰り返しを 'for k in keys:' – stefan

関連する問題