0

次のような形式のタブ区切りファイル ( raw.txt) があります。

type    A1    A2    A3    A4    ....
params  int   char  char  char  ...
data    1     abc   cde   fgh   ...
type    B1    B2    B3    B4    ....
feature int   char  char  char  ...
data    2     aaa   bbb   ccc   ...   
type    C1    C2    C3    C4    ....
stats   int   int   char  char  ...
data    2     11    aa    bb    ...
data    3     12    cc    cc    ...
data    4     13    dd    dd    ...
data    5     14    ee    ee    ...
...     ...   ...   ...   ...   ...

そのようなファイルを解析したいので、ファイル名の名前のフォルダーを作成し、そのフォルダー内にtypes. ファイルはtype、たとえば次の行で観察された データで作成されます。

/raw/file1
A1    A2    A3    A4    ....
int   char  char  char  ...
1     abc   cde   fgh   ...

/raw/file2
B1    B2    B3    B4    ....
int   char  char  char  ...
2     aaa   bbb   ccc   ...

/raw/file3
C1    C2    C3    C4    ....
int   int   char  char  ...
2     11    aa    bb    ...
3     12    cc    cc    ...
4     13    dd    dd    ...
5     14    ee    ee    ...
...   ...   ...   ...   ...

など...そして、次のような辞書を作成したい

dict1 = {A1:['int', [1]], A2:['char', ['abc']], ...}
dict2 = {B1:['int', [2]], B2:['char', ['aaa']], ...}
dict3 = {C1:['int', [2, 3, 4, 5], C2:['int', [11, 12, 13, 14, ...]], ...}

これは非常に大きなファイルであり、そのような巨大なファイルを解析するとウィンドウがハングし、ファイルからそのような出力を取得する方法がわからないため、どうすればよいですか。

4

1 に答える 1

0

これは、ファイルを解析して新しいファイルを生成するためのコードです。リストにはnewfile、ファイルに書き込む前に、各タイプのデータが一時的に保存されます。で始まる行は、'type'newfileをトリガーしてそのタイプの結果を格納し、内容が含まれていた場合newfileはファイルに書き込みます。変数は、incを呼び出すたびにインクリメントwritefile()され、ファイル名のサフィックスとして使用されます。以前writefile()str.format()、動的なファイル名を作成し、幅6で左寄せされたファイルに書き込み、から任意の数の値を取得していましたlinelist

def writefile(newfilelist, suffix):
  with open('file{}'.format(suffix), 'w') as f:
    for linelist in newfilelist:
      f.write(('{:<6}'*len(linelist)).format(*linelist) + '\n')

import os
with open('raw.txt') as file:
  os.mkdir('raw')
  os.chdir('raw')
  newfile = []
  inc = 0
  for line in file:
    linelist = line.split()
    if linelist[0] == 'type':
      if newfile:
        inc += 1
        writefile(newfile,inc)
        newfile = []
      newfile.append(linelist[1:])
    else:
      newfile.append(linelist[1:])
  if newfile:
    inc += 1
    writefile(newfile,inc)
于 2013-02-23T08:02:10.843 に答える