2014-07-25 2 views
1

У меня есть папка с 50 файлами .txt, содержащими данные в следующем формате.Извлечение данных из нескольких файлов TXT и создание сводного файла CSV в Python

=== Predictions on test data === 

inst#  actual predicted error distribution (OFTd1_OF_Latency) 
    1  1:S  2:R + 0.125,*0.875 (73.84) 

Мне нужно написать программу, которая сочетает в себе следующее: мой номер индекса (I), буква истинного класса (R или S), буква предсказанного класса, и каждый из предсказаний распределения (десятичные знаки меньше 1,0).

Я хотел бы, чтобы он выглядел следующим образом, когда был закончен, но предпочтительно как CSV-файл.

ID True Pred S  R 
1 S  R  0.125 0.875 
2 R  R  0.105 0.895 
3 S  S  0.945 0.055 
. .  .  .  . 
. .  .  .  . 
. .  .  .  . 
n S  S  0.900 0.100 

Я новичок и немного нечеткой о том, как получить все, что разобраны, а затем сцепляются и добавляется. Вот что я думал, но не стесняйтесь предлагать другое направление, если это будет проще.

for i in range(1, n): 
    s = str(i) 
    readin = open('mydata/output/output'+s+'out','r') 
    #The files are all named the same but with different numbers associated 
    output = open("mydata/summary.csv", "a") 
    storage = [] 
    for line in readin: 
    #data extraction/concatenation here 
    if line.startswith('1'): 
     id = i 
     true = # split at the ':' and take the letter after it 
     pred = # split at the second ':' and take the letter after it 
     #some have error '+'s and some don't so I'm not exactly sure what to do to get the distributions 
     ds = # split at the ',' and take the string of 5 digits before it 
     if pred == 'R': 
      dr = #skip the character after the comma but take the have characters after 
     else: 
      #take the five characters after the comma 
     lineholder = id+' , '+true+' , '+pred+' , '+ds+' , '+dr 
    else: continue 
    output.write(lineholder) 

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

Благодарим за помощь!

ответ

0

Ну, в первую очередь, если вы хотите использовать CSV, вы должны использовать CSV-модуль, который поставляется с python. Подробнее об этом модуле здесь: https://docs.python.org/2.7/library/csv.html Я не буду демонстрировать, как его использовать, потому что это довольно просто.

Что касается чтения входных данных, вот мое предложение, как разбить каждую строку самих данных. Я полагаю, что строки данных в файле ввода имеют свои значения, разделенных пробелами, а каждое значение не может содержать пробел:

def process_line(id_, line): 
    pieces = line.split() # Now we have an array of values 
    true = pieces[1].split(':')[1] # split at the ':' and take the letter after it 
    pred = pieces[2].split(':')[1] # split at the second ':' and take the letter after it 
    if len(pieces) == 6: # There was an error, the + is there 
     p4 = pieces[4] 
    else: # There was no '+' only spaces 
     p4 = pieces[3] 
    ds = p4.split(',')[0] # split at the ',' and take the string of 5 digits before it 
    if pred == 'R': 
     dr = p4.split(',')[0][1:] #skip the character after the comma but take the have??? characters after 
    else: 
     dr = p4.split(',')[0] 
    return id_+' , '+true+' , '+pred+' , '+ds+' , '+dr 

То, что я в основном используется здесь была функция разделения строк: https://docs.python.org/2/library/stdtypes.html#str.split и в одном месте, это просто синтаксис str [1:], чтобы пропустить первый символ строки (строки - массивы в конце концов, мы можем использовать этот синтаксис разрезания).

Помните, что моя функция не будет обрабатывать какие-либо ошибки или строки, созданные иначе, чем те, которые вы опубликовали в качестве примера. Если значения в каждой строке разделены вкладками, а не пробелами, вы должны заменить эту строку: pieces = line.split() с pieces = line.split('\t').

+0

Работала очень хорошо с несколькими модификациями (поместив ds под if/else, потому что если pred = S, то у нее была звездочка). Благодаря! – user3758068

0

я думаю, что и может separte поплавки, а затем объединить его со строками с помощью модуля повторной следующим образом:

import re 
file = open('sample.txt','r') 
strings=[[num for num in re.findall(r'\d+\.+\d+',i) for i in file.readlines()]] 
print (strings) 
file.close() 
file = open('sample.txt','r') 
num=[[num for num in re.findall(r'\w+\:+\w+',i) for i in file.readlines()]] 
print (num) 
s= num+strings 
print s #[['1:S','2:R'],['0.125','0.875','73.84']] output of the code 

эта прога написана для одной строки и может использовать его для нескольких линии, как хорошо, но и нужно использовать цикл для этого

содержание sample.txt: 1 1: 2 S: R + 0,125 * 0,875 (73,84)

2 1: S 2: R + 0,15, 0,85 * (69,4)

при запуске прога результат будет: [['1: S,' 2: R '], [' 1: S ',' 2: R '], [' 0.125 ',' 0.875 ', '73 0,84 '], [' 0,15 '0,85, '69 0,4']]

просто сцепить их

0

Оно использует регулярные выражения и модуль CSV.

import re 
import csv 

matcher = re.compile(r'[[:blank:]]*1.*:(.).*:(.).* ([^ ]*),[^0-9]?(.*) ') 
filenametemplate = 'mydata/output/output%iout' 

output = csv.writer(open('mydata/summary.csv', 'w')) 

for i in range(1, n): 
    for line in open(filenametemplate % i): 
     m = matcher.match(line) 
     if m: 
      output.write([i] + list(m.groups())) 
Смежные вопросы