Подтвердить что ты не робот

Пустые строки в файле после сортировки содержимого текстового файла в python

У меня есть этот небольшой script, который сортирует содержимое текстового файла

# The built-in function `open` opens a file and returns a file object.

# Read mode opens a file for reading only.
try:
    f = open("tracks.txt", "r")


    try:
        # Read the entire contents of a file at once.
       # string = f.read() 
        # OR read one line at a time.
        #line = f.readline()
        # OR read all the lines into a list.
        lines = f.readlines()
        lines.sort()
        f.close()
        f = open('tracks.txt', 'w')
        f.writelines(lines) # Write a sequence of strings to a file
    finally:
        f.close()
except IOError:
    pass

единственная проблема заключается в том, что текст отображается внизу текстового файла каждый раз, когда он сортируется...

Я предполагаю, что он также сортирует пустые строки... кто-нибудь знает почему?

и, может быть, вы можете предложить несколько советов о том, как избежать этого?

заранее спасибо

4b9b3361

Ответ 1

"Пустая" строка, считанная из текстового файла, представлена ​​в Python строкой, содержащей только новую строку ( "\n" ). Вы также можете избежать строк, чьи "данные" состоят только из пробелов, вкладок и т.д. ( "Пробелы" ). Метод str.strip() позволяет обнаруживать оба случая (новая строка - это пробел).

f = open("tracks.txt", "r")
# omit empty lines and lines containing only whitespace
lines = [line for line in f if line.strip()]
f.close()
lines.sort()
# now write the output file

Ответ 2

Это прекрасная возможность сделать некоторые тестовые разработки (см. ниже). Некоторые наблюдения:

  • В приведенном ниже примере я опускаю аспект чтения и записи в файл. Это не важно для этого вопроса, на мой взгляд.

  • Я предполагаю, что вы хотите разделить последние строки и опустить пустые строки. Если нет, вам нужно настроить. (Но у вас будет основа для утверждения/подтверждения ожидаемого поведения.)

  • Я согласен с chryss выше, что вам вообще не нужно рефлексивно обертывать вещи в блоках try в Python. Я считаю, что анти-шаблон, который исходит от Java (который заставляет его).

В любом случае, здесь тест:

import unittest

def sort_lines(text):
    """Return text sorted by line, remove empty lines and strip trailing whitespace."""
    lines = text.split('\n')
    non_empty = [line.rstrip() for line in lines if line.strip()]
    non_empty.sort()
    return '\n'.join(non_empty)

class SortTest(unittest.TestCase):

  def test(self):
    data_to_sort = """z some stuff
c some other stuff


d more stuff after blank lines
b another line
a the last line"""

    actual = sort_lines(data_to_sort)
    expected = """a the last line
b another line
c some other stuff
d more stuff after blank lines
z some stuff"""

    self.assertEquals(actual, expected, "no match!")

unittest.main()

Ответ 3

Причина, по которой он сортирует пустые строки, заключается в том, что они есть. Пустая строка - это пустая строка, за которой следуют \n (или\r\n или \r, в зависимости от ОС). Отлично сортируется.

Я хотел бы отметить, что "try:", вложенный в блок "try:... except", немного уродлив, и я закрою файл после чтения, для стиля.