Извлечение данных из очень большого текстового файла с использованием Python и панд? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь извлечь строки из очень большого текстового файла (10 Гб).Текстовый файл содержит выходные данные инженерного программного обеспечения (это не файл CSV).Я хочу скопировать из строки 1 в первую строку, содержащую строку «stop», а затем продолжить с первой строки, содержащей «restart», до конца файла.

Следующий код работает, но он довольно медленный (около минуты).Есть ли лучший способ сделать это с помощью панд?Я пробовал функцию read_csv, но у меня нет разделителя для ввода.

file_to_copy = r"C:\Users\joedoe\Desktop\C ANSYS R1\PATCHED\modes.txt"
output = r"C:\Users\joedoe\Desktop\C ANSYS R1\PATCHED\modes_extract.txt"
stop = '***** EIGENVECTOR (MODE SHAPE) SOLUTION *****'
restart = '***** PARTICIPATION FACTOR CALCULATION *****  X  DIRECTION'

with open(file_to_copy) as f:
    orig = f.readlines()

newf = open(output, "w")

write = True
first_time = True
for line in orig:
    if first_time == True:
        if stop in line:
            first_time = False
            write = False
            for i in range(300):
                newf.write(
                '\n  -------------------- MIDDLE OF THE FILE -------------------')
            newf.write('\n\n')
    if restart in line: write = True
    if write: newf.write(line)
newf.close()
print('Done.')

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы должны использовать генераторы Python.Кроме того, печать замедляет процесс.

Ниже приведено несколько примеров использования генераторов:

Генератор Python для чтения больших файлов CSV

LazyСпособ чтения большого файла в Python?

0 голосов
/ 28 февраля 2019

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

write = True
first_time = True

with open(file_to_copy) as f, open(output, "w") as newf:
    for line in f:
      if first_time == True:
          if stop in line:
              first_time = False
              write = False
              for i in range(300):
                  newf.write(
                  '\n  -------------------- MIDDLE OF THE FILE -------------------')
              print('\n\n')
      if restart in line: write = True
      if write: newf.write(line)
print('Done.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...