Удалить "\ n" с полосой в Python? - PullRequest
0 голосов
/ 18 ноября 2018

Я работаю над текстом файла, но, так как в начале у него тоже есть пробелы, когда я пытаюсь удалить свой \n, используя режим strip и понимание list, я получаю список с пустым элементы (" ") и я не знаю, как их удалить. У меня есть текст и мой код:

with open(filename) as f:
    testo= f.readlines()
[e.strip() for e in testo]

но я получаю такой список:

[' ', ' ', 'word1', 'word2', 'word3', ' ']

Я хотел знать, смогу ли я решить это с помощью метода strip, в противном случае - с помощью другого метода.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Вы можете использовать генератор для чтения всех строк и strip() нежелательных новых строк.

Из генератора вы используете только те элементы, которые являются «Истиной» - пустые строки считаются False.

Преимущество: вы создаете только один список и избавляетесь от пустых строк:

Записать файл:

filename = "t.txt"
with open(filename,"w") as f:
    f.write("""

  c
  oo
  l

  te
  xt
  """)

Файл процесса:

with open(filename) as f:
    testo = [x for x in (line.strip() for line in f) if x] # f.readlines() not needed. f is
                                                          # an iterable in its own right

print(testo)  # ['c', 'oo', 'l', 'te', 'xt']

Вы можете сделать то же самое:

testo = [line.strip() for line in f if line.strip()]

но это выполнит strip() дважды и будет немного менее эффективным.

Вывод:

['c', 'oo', 'l', 'te', 'xt']

Доку:


Предлагаемая альтернатива от Эли Корвиго :

testo = list(filter(bool, map(str.strip, f)))

с по сути то же самое - замена явного списка comp с использованием генератора comp на map из str.strip на f (что приводит к генератору) и применение filter к нему, чтобы передать его в список.

См. встроенную функцию для документации filter,map,bool.

Мне больше нравится мой, хотя; о)

0 голосов
/ 18 ноября 2018

Из данных, которые вы нам показали, похоже, что есть строка с пробелом.Имея это в виду, вы должны решить, хотите ли вы этого или нет.

Если вы этого хотите, то ваш код должен выглядеть примерно так:

with open(filename) as f:
   testo=f.readlines()
list(filter(None, (l.rstrip('\n') for l in testo)))

В случаеВы не хотите, чтобы строки были только пробельными символами, вы можете сделать что-то вроде:

with open(filename) as f:
   testo=f.readlines()
[e.rstrip('\n') for e in testo if e.strip()]

В этом случае мы стараемся не зачеркивать: «слово с начальными и конечными пробелами» в «слово с начальным»и завершающие пробелы ", поскольку в некоторых случаях это может изменить семантику строки:)

0 голосов
/ 18 ноября 2018

Вы получаете эти пустые строки, потому что несколько строк были просто пустыми переносами строк.Вот код для удаления этих пустых строк.

with open(filename) as f:
    testo = [e.strip() for e in f.readlines()]
    final_list = list(filter(lambda x: x != '', testo))
    print(final_list)

Без лямбды и использования карты:

with open(filename) as f:
    final_list = list(filter(bool, map(str.strip, f)))
    print(final_list)

Другое решение:

with open(filename) as f:
 testo =  [x for x in f.read().splitlines() if x]
 print(testo)

Для второго решенияИсточник: https://stackoverflow.com/a/15233379/2988776

Для повышения производительности см. ответ @Patrick

...