AttributeError: объект «список» не имеет атрибута «заменить» при попытке удалить «/ n»

У меня есть куча файлов, которые мне нужно переименовать. У меня есть имена в текстовом файле по порядку, и мне нужно удалить разрывы строк, которые вставляются при чтении текстового файла, но я продолжаю получать эту ошибку. AttributeError: объект 'list' не имеет атрибута 'replace' при попытке удалить '/n'

Любая помощь приветствуется, я действительно не знаю, что делаю.

from os import rename, listdir


fnames = listdir('.')
file = open("names.txt", "r")
namelist = [line.split(' ') for line in file.readlines()]
namelist = [n.replace('\n', '') for n in namelist]

print (namelist)

person Alec    schedule 20.12.2017    source источник
comment
где вы используете fnames кроме объявления?   -  person oBit91    schedule 21.12.2017
comment
Вы хотите плоский список в качестве конечного результата?   -  person JacobIRR    schedule 21.12.2017


Ответы (2)


Проблема в том, что после split каждый n в namelist уже является списком строк.

Если вы хотите удалить символы новой строки в конце строк, вы можете либо поменять местами два понимания, сначала на remove, а затем на split, либо просто объединить их в одно. Кроме того, вместо replace можно использовать strip, чтобы избавиться от символа новой строки в конце строки.

namelist = [line.strip().split(' ') for line in file]
person tobias_k    schedule 20.12.2017
comment
Хорошая идея с strip(). Это более элегантно и более питонично, чем замена символа новой строки пробелом, который в зависимости от операционной системы может не всегда быть просто \n. - person cezar; 21.12.2017

.readlines() возвращает список строк, каждая из которых заканчивается на \n. В другом месте ожидать его не имеет смысла (при условии, что вы используете универсальные символы новой строки при чтении файла: режим "r", а не "rb").

Все это можно сделать намного короче, если вы просто перебираете файл (он также дает строки):

namelist = []
for line in input_file:  
    namelist.extend(line.rstrip('\n').split(' ')) 

В качестве забавного упражнения его можно сделать однострочным (немного менее эффективным):

namelist = sum((line.rstrip('\n').split(' ') for line in file), [])
person 9000    schedule 20.12.2017