2013-02-23 3 views
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, ...]], ...} 

Как я могу это сделать потому что это очень большой файл, и разбор такого огромного файла висит в окне, а также я не могу понять, как я могу получить такой вывод из файла.

+0

Каков код, который у вас есть до сих пор, что «висит окно»? –

+0

Я повторяю файл в командной строке, которая зависает командной строкой, и я не смог понять код, который даст мне такой вывод. – sam

+0

Трудно сказать, какие строки вы хотите фильтровать. Как правило, вы должны сделать цикл for и разбивать каждую строку на ('\ t'), а затем делать что-то с линиями, которые начинаются с любого типа, который вы хотите фильтровать. – bozdoz

ответ

0

Вот код для разбора файла и генерации новых файлов. Список newfile временно сохраняет данные для каждого типа перед записью в файл. Строка, начинающаяся с 'type', будет запускать новый файл для хранения результатов для этого типа, и если бы содержимое было в 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) 
+0

он не создает несколько файлов. из предыдущего примера должно быть 3 файла, но он создает только один – sam

+0

@sam: Какую версию python вы используете? Каково имя выходного файла? – Octipi

+0

Я использую python 2.7. Я попытался снова создать только один файл с именем file1, но он должен создать 3 файла. – sam

Смежные вопросы