2013-09-22 3 views
1

Я написал сценарий python для обработки текстовых файлов. Ввод - файл с несколькими строками. В начале каждой строки есть число (1, 2, 3 ..., n). Затем пустая строка и последняя строка, на которой написан какой-то текст.Улучшение чтения файлов кода python

Мне нужно прочитать этот файл, чтобы удалить некоторые строки в начале, а некоторые в конце (например, число от 1 до 5, а затем число 78 до конца). Я хочу записать оставшиеся строки в новом файле (в новом каталоге) и перенумеровать первые числа, записанные на этих строках (в моем примере 6 станет 1, 7 2 и т. Д.)

Я написал следующее:

def treatFiles(oldFile,newFile,firstF, startF, lastF): 

    % firstF is simply an index 
    % startF corresponds to the first line I want to keep 
    % lastF corresponds to the last line I want to keep 
    numberFToDeleteBeginning = int(startF) - int(firstF) 
    with open(oldFile) as old, open(newFile, 'w') as new: 
     countLine = 0 
     for line in old: 
      countLine += 1 
      if countLine <= numberFToDeleteBeginning: 
       pass 
      elif countLine > int(lastF) - int(firstF): 
       pass 
      elif line.split(',')[0] == '\n': 
       newLineList = line.split(',') 
       new.write(line) 
      else:   
       newLineList = [str(countLine - numberFToDeleteBeginning)] + line.split(',') 
       del newLineList[1] 
       newLine = str(newLineList[0]) 
       for k in range(1, len(newLineList)): 
        newLine = newLine + ',' + str(newLineList[k])  
       new.write(newLine) 


    if __name__ == '__main__': 
     from sys import argv 
     import os 

     os.makedirs('treatedFiles') 
     new = 'treatedFiles/' + argv[1] 
     treatFiles(argv[1], argv[2], newFile, argv[3], argv[4], argv[5]) 

Мой код работает правильно, но слишком медленно (у меня есть файлы о 10Gb для лечения, и это работает уже в течение нескольких часов).

Кто-нибудь знает, как я могу его улучшить?

+0

You пытаются проанализировать 10Gb txt? Если у вас нет суперкомпьютера, вы должны ожидать, что это займет недели, даже с эффективным кодом. Что вы пытаетесь достичь? –

+5

@SamyBencherif: Это совсем не так. – Blender

+1

@Samy Я анализирую несколько таких файлов в большинстве дней. –

ответ

3

Я бы избавиться от петли for в середине и дорогой .split():

from itertools import islice 

def treatFiles(old_file, new_file, index, start, end): 
    with open(old_file, 'r') as old, open(new_file, 'w') as new: 
     sliced_file = islice(old, start - index, end - index) 

     for line_number, line in enumerate(sliced_file, start=1): 
      number, rest = line.split(',', 1) 

      if number == '\n': 
       new.write(line) 
      else: 
       new.write(str(line_number) + ',' + rest) 

Кроме того, конвертировать ваши три числовые аргументы целыми числами, прежде чем передать их в функцию:

treatFiles(argv[1], argv[2], newFile, int(argv[3]), int(argv[4]), int(argv[5])) 
+0

Мне просто нужно заменить 'new.write (line_number + ',' + rest)' на 'new.write (str (line_number) + ',' + rest)' и он работает. благодаря! – teaLeef

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