Python: метод readlines() создает пустые списки

Я пытаюсь разобрать элементы из текстового файла со строками текста, разделенными точкой с запятой, например:

4037;HKO_2005;OBJECT-ORIENTED PROGRAMMING               ;18.12.2011;5

4037;HKO_2009;DATABASES I                               ;2.5.2011;5

4037;HKO_2011;ALGORITHMS I                              ;7.5.2011;5

4037;HKO_2038;PROGRAMMING BASICS IN JAVA                ;22.5.2010;5

к списку таких списков:

['4037', 'HKO_2005', 'OBJECT-ORIENTED PROGRAMMING', '18.12.2011', '5'],
['4037', 'HKO_2009', 'DATABASES I', '2.5.2011', '5'],
['4037', 'HKO_2011', 'ALGORITHMS I', '7.5.2011', '5'],
['4037', 'HKO_2038', 'PROGRAMMING BASICS IN JAVA', '22.5.2010', '5']

Прямо сейчас код, который я использую для тестирования, выглядит так:

class Main:
    def inputFile(self):
        with open('data.txt', 'r') as data:
            self.stuff = data.readlines()
            self.separate = [elem.strip().split(';') for elem in self.stuff]
            print(self.separate)

justdoit = Main()
justdoit.inputFile()

Моя проблема в том, что вы уже видели: в текстовом файле не было двойных новых строк, пока я не вставил его сюда. Используя мой код, метод readlines() создает пустые списки между символами новой строки следующим образом:

['4037', 'HKO_2005', 'OBJECT-ORIENTED PROGRAMMING          ', '18.12.2011', '5'],
[''],
['4037', 'HKO_2009', 'DATABASES I                          ', '2.5.2011', '5'],
[''],
['4037', 'HKO_2011', 'ALGORITHMS I                         ', '7.5.2011', '5'],
[''],
['4037', 'HKO_2038', 'PROGRAMMING BASICS IN JAVA           ', '22.5.2010', '5']
['']

Я думаю, что позже я смогу удалить пробелы из названий курсов с помощью rstrip(), но новые строки вызывают у меня головную боль. Ранее из-за этого я получал IndexError и понятия не имел, что в текстовом файле есть двойные символы новой строки. Как я могу эффективно игнорировать или удалять эти дополнительные символы новой строки до создания списков?


person jonraem    schedule 23.03.2014    source источник


Ответы (1)


Вы можете добавить условие к пониманию списка:

self.separate = [elem.strip().split(';') for elem in self.stuff if elem.strip()]
person Daniel Roseman    schedule 23.03.2014
comment
Большое спасибо, это сработало! Что именно означает это условие? - person jonraem; 23.03.2014
comment
Это сокращение Python для if elem.strip() != ''. Таким образом, ваши пустые строки после удаления становятся пустой строкой, которая оценивается как логическое значение False, поэтому они не добавляются в список. - person PaulMcG; 23.03.2014