2013-10-02 3 views
-4

У меня есть несколько файлов журналов Мне нужно извлечь и форматировать данные. некоторые из этих файлов журнала очень большие, с более чем 10 000 строк.Python - форматирование определенных данных в текстовых файлах

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

Пример данных мне нужно отредактировать ниже:

136: add student 50000000 35011/Y01T :Unknown id in field 3 - ignoring line 

137: add student 50000000 5031/Y01S :Unknown id in field 3 - ignoring line 

138: add student 50000000 881/Y01S :Unknown course idnumber in field 4 - ignoring line 

139: add student 50000000 5732/Y01S :Unknown id in field 3 - ignoring line 

134: add student 50000000 W250/Y02S :OK 

135: add student 50000000 35033/Y01T :OK 

Мне нужно найти файл и удалить все строки, с суффиксом: OK. Затем мне нужно отредактировать оставшиеся строки в в формат CSV, таких как:

add,student,50000000,1234/abcd 

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

ответ

0

Это может быть решение:

import sys 

if len(sys.argv) != 2: 
    print 'Add an input file as parameter' 
    sys.exit(1) 

print 'opening file: %s' % sys.argv[1] 

with open(sys.argv[1]) as input, open('output', 'w+') as output: 
    for line in input: 
     if line is not None: 
      if line == '\n': 
       pass 
      elif 'OK' in line: 
       pass 
      else: 
       new_line = line.split(' ', 7) 
       output.write('%s,%s,%s,%s/%s\n' % (new_line[1], new_line[2], new_line[3], new_line[4], new_line[6])) 
       # just for checking purposes let's print the lines 
       print '%s,%s,%s,%s/%s' % (new_line[1], new_line[2], new_line[3], new_line[4], new_line[6]) 

Берегитесь имя выходного файла!

+0

Я дам ему поиграть с кодом. Большое спасибо за ваш ответ. – Russ

0

Вы можете изменить регулярное выражение, чтобы удовлетворить ваши потребности, если они отличаются, и вы можете также изменить параметры csv.writer, если вам нужны другие разделители:

import re, csv 

regex = re.compile(r"(\d+)\s*:\s*(\w+)\s+(\w+)\s+(\w+)\s+([\w/ ]+?):\s*(.+)") 
with open("out.csv", "w") as outfile: 
    writer = csv.writer(outfile, delimiter=',', quotechar='"') 
    with open("log.txt") as f: 
     for line in f: 
      m = regex.match(line) 
      if m and m.group(6) != "OK": 
       writer.writerow(m.groups()[1:-1]) 
+0

Привет, спасибо за ваш ответ. они очень полезны для меня, и я учусь быстро. очень благодарен за помощь. – Russ

0

Спасибо за помощь, ребята. Будучи новичком, код, в котором я оказался, не так элегантен, но он все еще выполняет работу :).

#open the file and create the CSV after filtering the input file. 
def openFile(filename, keyword): #defines the function to open the file. User to pass two variables. 

    list = [] 
    string = '' 

    f = open(filename, 'r') #opens the file as a read and places it into the variable 'f'. 
    for line in f: #for each line in 'f'. 
     if keyword in line: #check to see if the keyword is in the line. 
      list.append(line) #add the line to the list. 

    print(list) #test. 

    for each in list: #filter and clean the info, format the info into a CSV format. 
     choppy = each.partition(': ') #split to remove the prefix. 
     chunk = choppy[2] #take the good string. 
     choppy = chunk.partition(' :') #split to remove the suffix. 
     chunk = choppy[0] #take the good string. 
     strsplit = chunk.split(' ') #split the string by spaces ' '. 
     line = strsplit[0] + ',' + strsplit[1] + ',' + strsplit[2] + ',' + strsplit[3] + ' ' + strsplit[4] + ' ' + strsplit[5] + '\n' #concatenate the strings. 

     string = string + line #concatenate each line to create a single string. 

    print(string) #test. 

    f = open(keyword + '.csv', 'w') #open a file to write. 
    f.write(string) #write the string to the file. 
    f.close() #close the file. 



openFile('russtest.txt', 'cat') 
openFile('CRON ENROL LOG 200913.txt', 'field 4') 

Спасибо :).

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