Вы используете необработанный строковый литерал.
r'\n'
- это не символ новой строки, это строка длины два, содержащая символы "\" и "n".
>>> r'\n'
'\\n'
>>> len(r'\n')
2
В противном случае ваш оригинальный подход работает (почти) нормально.
>>> file_stuff = ['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']
>>> [x.replace('\n', '') for x in file_stuff]
['John Smith', '', 'Gardener', '', 'Age 27', '', 'Englishman']
Мы можем отфильтровать пустые строки следующим образом:
>>> file_stuff = ['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']
>>> no_newline = (x.replace('\n', '') for x in file_stuff)
>>> result = [x for x in no_newline if x]
>>> result
['John Smith', 'Gardener', 'Age 27', 'Englishman']
, где no_newline
- генератор с эффективным использованием памятиэто не создает промежуточный временный список.
Если вы просто хотите удалить пробелы и символы новой строки из начала и конца строк, рассмотрите метод str.strip
.
>>> file_stuff = ['John Smith\n', '\n', 'Gardener\n', '\n', 'Age 27\n', '\n', 'Englishman']
>>> no_newline = (x.strip() for x in file_stuff)
>>> result = [x for x in no_newline if x]
>>> result
['John Smith', 'Gardener', 'Age 27', 'Englishman']
Это может быть сокращено до
>>> result = [x.strip() for x in file_stuff if x.strip()]
>>> result
['John Smith', 'Gardener', 'Age 27', 'Englishman']
, если вы можете справиться с бесполезностью вызова str.strip
дважды за строку.