Как удалить \n из элемента списка?

Я пытаюсь заставить Python читать строку из файла .txt и записывать элементы первой строки в список. Элементы в файле были разделены на вкладки, поэтому я использовал split("\t") для разделения элементов. Поскольку в файле .txt есть много элементов, я сохранил данные, найденные в каждой строке, в отдельный список.

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

['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']

Как удалить \n из последнего элемента списка и сделать его просто '7.3'?

Ответ 1

Если вы хотите удалить \n только из последнего элемента, используйте это:

t[-1] = t[-1].strip()

Если вы хотите удалить \n из всех элементов, используйте это:

t = map(lambda s: s.strip(), t)

Вы также можете рассмотреть возможность удаления \n перед:

line = line.strip()
# split line...

Ответ 2

От Python3 вперед

map больше не возвращает list, но a mapObject, поэтому ответ будет выглядеть примерно так:

>>> map(lambda x:x.strip(),l)
<map object at 0x7f00b1839fd0>

Подробнее об этом можно узнать в Что нового в Python 3.0.

map() и filter() возвращают итераторы. Если вам действительно нужен list, быстрое исправление, например. list(map(...))

Итак, какие способы получить это?


Случай 1 - вызов list через map с lambda

map возвращает итератор. list - это функция, которая может конвертировать итератор в список. Следовательно, вам нужно будет обернуть вызов list вокруг map. Таким образом, ответ теперь становится,

>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> list(map(lambda x:x.strip(),l))
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

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

$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(lambda x:x.strip(),l))"
100000 loops, best of 3: 2.22 usec per loop

2,22 микросекунды. Это не так уж плохо. Но есть ли более эффективные способы?


Случай 2 - вызов list через map с выводом lambda

lambda недоволен многими в сообществе Python (включая Guido). Кроме того, это значительно снизит скорость программы. Следовательно, мы должны избегать этого как можно больше. Функция верхнего уровня str.strip. Приходит к нам на помощь.

map можно переписать без использования lambda с помощью str.strip в качестве

>>> list(map(str.strip,l))
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

А теперь на время.

$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(str.strip,l))"
1000000 loops, best of 3: 1.38 usec per loop

Фантастические. Вы можете увидеть различия в эффективности между двумя способами. Это почти на 60% быстрее. Таким образом, подход без использования lambda является лучшим выбором здесь.


Случай 3 - Следующие рекомендации, Обычный способ

Еще один важный момент из Что нового в Python 3.0 заключается в том, что нам рекомендуется избегать map, где это возможно.

Особенно сложно использовать map() для побочных эффектов функция; правильное преобразование состоит в использовании регулярного цикла for(поскольку создание списка будет просто расточительным).

Таким образом, мы можем решить эту проблему без map с помощью регулярного цикла for.

Тривиальный способ решения (грубой силы) был бы: -

>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> final_list = []
>>> for i in l:
...     final_list.append(i.strip())
... 
>>> final_list
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

Настройка синхронизации

def f():
    l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
    final_list = []
    for i in l:
         final_list.append(i.strip())
import timeit
print(min(timeit.repeat("f()","from __main__ import f")))

И результат.

1.5322505849981098

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


Случай 4 - Список понятий

A понимание списка здесь также возможно и такое же, как в Python2.

>>> [i.strip() for i in l]
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

Теперь для таймингов:

$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];[i.strip() for i in l]"
1000000 loops, best of 3: 1.28 usec per loop

Как вы можете видеть, понимание списка более эффективно, чем map (даже без lambda). Следовательно, правило большого пальца в Python3 заключается в использовании понимания списка вместо map


Случай 5 - Механизмы на месте и эффективность использования пространства (T-M-T)

Последний способ - внести изменения в место в самом списке. Это позволит сэкономить много места в памяти. Это можно сделать, используя enumerate.

>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> for i,s in enumerate(l):
...     l[i] = s.strip()
... 
>>> l
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

Результат синхронизации будет 1.4806894720022683. Но, тем не менее, этот путь является пространственно эффективным.


Заключение

Сравнительный список таймингов (оба Python 3.4.3 и Python 3.5.0)

----------------------------------------------------
|Case| method          | Py3.4 |Place| Py3.5 |Place|
|----|-----------------|-------|-----|-------|-----|
| 1  | map with lambda | 2.22u | 5   | 2.85u | 5   |
| 2  | map w/o lambda  | 1.38u | 2   | 2.00u | 2   |
| 3  | brute-force     | 1.53u | 4   | 2.22u | 4   |
| 4  | list comp       | 1.28u | 1   | 1.25u | 1   |
| 5  | in-place        | 1.48u | 3   | 2.14u | 3   |
----------------------------------------------------

Наконец, обратите внимание, что наилучшим способом является понимание списка, а map с использованием lambda является наихудшим. Но снова --- ТОЛЬКО В PYTHON3

Ответ 3

Похоже, вы хотите что-то вроде функции Perl chomp().

Это тривиально делать в Python:

def chomp(s):
    return s[:-1] if s.endswith('\n') else s

... если вы используете Python 2.6 или новее. В противном случае просто используйте слегка более подробный:

def chomp(s):
    if s.endwith('\n'):
        return s[:-1]
    else:
        return s

Если вы хотите удалить все новые строки из конца строки (в нечетном случае, когда по какой-то причине может быть несколько конечных символов перевода строки):

def chomps(s):
    return s.rstrip('\n')

Очевидно, вы никогда не должны видеть такую ​​строку, возвращаемую любым обычным файлом Python readline() и readlines().

Я видел, как люди слепо удаляют последние символы (используя s[:-1] slicing) из результатов файла readline() и подобных функций. Это плохая идея, потому что это может привести к ошибке в последней строке файла (в случае, когда файл заканчивается чем-то другим, кроме новой строки).

Сначала вы можете быть усыплены ложным чувством безопасности, когда слепо зачищаете конечных персонажей с строк, которые вы читали. Если вы используете обычный текстовый редактор для создания файлов тестового набора, у большинства из них будет добавлена ​​новая строка, добавленная к концу последней строки. Чтобы создать правильный тестовый файл, используйте код:

f = open('sometest.txt', 'w')
f.write('some text')
f.close()

... а затем, если вы повторно откроете этот файл и используете методы файла readline() или readlines() на нем, вы обнаружите, что текст читается без завершающей строки новой строки.

Эта ошибка для учета текстовых файлов, заканчивающихся символами не-новой строки, в течение многих лет страдает от многих утилит UNIX и языков сценариев. Это глупая ошибка базовой базы, которая ползет в код достаточно часто, чтобы быть вредителем, но не настолько часто, чтобы люди могли учиться на ней. Мы можем утверждать, что "текстовые" файлы без окончательной новой строки являются "коррумпированными" или нестандартными; и это может быть применимо для некоторых спецификаций программирования.

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

Ответ 4

Использование списка:

myList = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']

[(el.strip()) for el in myList]

Ответ 5

из этой ссылки:

вы можете использовать метод rstrip(). Пример

mystring = "hello\n"    
print(mystring.rstrip('\n'))

Ответ 6

Как альтернативный метод, если вы знаете, что в ваших данных нет пробелов, что, кажется, так, вы можете использовать split() (без аргументов). Это разделяется на пробел и использует более эффективный алгоритм, чем другая версия split. Он также удаляет пробелы с обоих концов.

line = line.split()

И что это.

Ответ 7

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

DELIMITER = '\t'
lines = list()
for line in open('file.txt'):
    lines.append(line.strip().split(DELIMITER))

lines имеет все содержимое вашего файла.

Можно также использовать списки, чтобы сделать это более компактным.

lines = [ line.strip().split(DELIMITER) for line in open('file.txt')]

Ответ 8

str.strip() удаляет пробельные символы. вы также можете передавать пользовательские символы в качестве аргумента для полосы. Функция полосы удаляет пробельные/пользовательские символы на обоих концах строки. lstrip() и rstrip() - это функции левой полосы и правой полосы соответственно.

Например:

test_str = "Vishaka\n" 
test_str = test_str.strip()

test_str now Vishaka

Ответ 9

Это также будет работать,

f=open('in.txt','r')

    for line in f:
            parline = line[:-1].split(',')

Ответ 10

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

Итак, у вас есть:

fileName = '7.3\n'

то просто выполните:

fileName.strip()

который оставит вас с 7.3. Затем сохраните это значение в последнем элементе набора.

Вы можете использовать lstrip() или rstrip() для удаления только левой или правой стороны.

Ответ 11

Это работает, чтобы вынуть \n (новую строку) с элемента в списке он просто берет первый элемент в строке off

def remove_end(s):
    templist=[]
    for i in s:
        templist.append(i)
    return(templist[0])

Ответ 12

У меня была эта проблема и она была решена с помощью функции chomp, описанной выше:

def chomp(s):
    return s[:-1] if s.endswith('\n') else s

def trim_newlines(slist):
    for i in range(len(slist)):
        slist[i] = chomp(slist[i])
    return slist
.....
names = theFile.readlines()
names = trim_newlines(names)
....

Ответ 13

Чтобы обрабатывать множество разделителей строк, включая комбинации символов, такие как \r\n, используйте splitlines. Объедините join и splitlines, чтобы удалить/замените все строки новой строки на строку s:

''.join(s.splitlines())

Чтобы удалить ровно одну конечную новую строку, передайте True в качестве аргумента keepends, чтобы сохранить разделители, удалив только разделители в последней строке:

def chomp(s):
    if len(s):
        lines = s.splitlines(True)
        last = lines.pop()
        return ''.join(lines + last.splitlines())
    else:
        return ''

Ответ 14

Поскольку вопрос OP заключается в том, чтобы удалить символ новой строки из последнего элемента, я бы reset с the_list[-1].rstrip():

>>> the_list = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> the_list[-1] = ls[-1].rstrip()
>>> the_list
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

Это O (1).