Ваш файл организован неудачным образом для обработки Pythonic.
Обратите внимание, что когда вы вызываете reader.read()
, вы читаете весь файл в память.Допустим, это занимает X байтов.
Вызов split
эффективно добавит еще X байтов использования памяти, так как создаст новую строку для каждой отдельной строки в файле.
Затем вы вызываете row[:x]
и row[x:]
, что добавит ДРУГИЕ байты X (потому что оператор среза делает копию).
Затем вы вызываете zip и создаете понимание списка,и т. д. и т. д. Строки и кортежи являются неизменяемыми данными, что означает, что вы всегда создаете их с нуля.
Я бы подошел к этой проблеме на более низком уровне.Откройте один дескриптор файла и укажите его начало файла.Откройте другое и попросите его найти начало (na / 0/1/2) значений (вы узнаете, где это, подсчитав пробелы).Теперь читайте одно имя и одно значение за раз, и если значение не «na», вы можете записать имя в выходной файл.Если вам необходимо также записать значения в выходной файл, сохраните их в памяти и запишите все сразу, как только вы закончите.
К сожалению, это будет сложнее, чем просто использование высокоуровневых функцийкоторый предоставляет Python (вам нужно будет написать код, который работает на уровне символов), но, как вы видели, за эти функции высокого уровня приходится платить.