Удалите последние пустые строки из файла с ошибкой, используя file.write (line) - PullRequest
0 голосов
/ 09 января 2020

Я пытался решить множество проблем здесь, в stack.overflow, чтобы удалить последние пустые строки из файла 2.txt (входные данные):

2.txt файл :

-11
B1
5
B1
-2
B1
7
B1
-11
B1
9
B1
-1
B1
-3
B1
19
B1
-22
B1
2
B1
1
B1
18
B1
-14
B1
0
B1
11
B1
-8
B1
-15

и единственным, который работал с использованием print(line), был { ссылка }. Но когда я пытаюсь использовать f.write(line) вместо print(line) в моем окончательном файле 2.txt (вывод), как показано ниже:

2.txt файла final:

-11B15B1-2B17B1-11B19B1-1B1-3B119B1-22B12B11B118B1-14B10B111B1-8B1-15
18
B1
-14
B1
0
B1
11
B1
-8
B1
-15

Однако, когда я использую код, использующий print line) вместо f.write (line), мой терминал bash отображает вывод с удаленными последними строками (см. print(line) result in terminal bash ниже), но с Деформация, равная 2.txt file final, ie, работает правильно. Я пытался понять, что происходит, но не добился никакого прогресса.

печать (строка) resut в терминале bash

-11B15B1-2B17B1-11B19B1-1B1-3B119B1-22B12B11B118B1-14B10B111B1-8B1-15
18
B1
-14
B1
0
B1
11
B1
-8
B1
-15

ОБНОВЛЕНИЕ :

Мой скрипт исключает последние строки файла 2.txt, но деформирует первые строки в терминале bash:

for line in open('2.txt'):
  line = line.rstrip()
  if line != '':
    print (line)

Мой скрипт деформирует первые строки файла 2.txt и также не удаляет последние строки, как требуется при выводе файла 3.txt:

with open("2.txt",'r+') as f:
  for line in open('3.txt'):
    line = line.rstrip()
    if line != '':
        f.write(line)

1 Ответ

1 голос
/ 09 января 2020

Исправление существующего подхода

rstrip() удаляет завершающий символ новой строки в дополнение к другому содержимому, поэтому, когда вы пишете результат, он оставляет курсор в конце той же строки .

Один из способов исправить это, понятно о том, что нужно изменить (весь код неизменен, но для добавления последней строки):

with open("2.txt",'r+') as f:
  for line in open('3.txt'):
    line = line.rstrip()
    if line != '':
        f.write(line)
        f.write(os.linesep)  # one extra line

Альтернативно, вы можете изменить f.write(line) на print(line, file=f).


Оптимизация для быстрой работы с большими файлами

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

То есть что-то вроде:

import os, sys
block_size = 4096 # 4kb blocks; decent chance this is your page size & disk sector size.
filename = sys.argv[1] # or replace this with a hardcoded name if you prefer

with open(filename, 'r+b') as f:   # seeking backwards only supported on files opened binary
    while True:
        f.seek(0, 2)                            # start at the end of the file
        offset = f.tell()                       # figure out where that is
        f.seek(max(0, offset - block_size), 0)  # move up to block_size bytes back
        offset = f.tell()                       # figure out where we are
        trailing_content = f.read()             # read from here to the end
        new_content = trailing_content.rstrip() # remove all whitespace
        if new_content == trailing_content:     # nothing to remove?
            break                               # then we're done.
        if(new_content != ''):                  # and if post-strip there's content...
            f.seek(offset + len(new_content))   # jump to its end...
            f.write(os.linesep.encode('utf-8')) # ...write a newline...
            f.truncate()                        # and then delete the rest of the file.
            break
        else:
            f.seek(offset, 0)                   # go to where our block started
            f.truncate()                        # and delete *everything* after it
            # run through the loop again, to see if there's still more trailing whitespace.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...