2015-12-07 6 views
0

У меня есть текстовый файл с именами, все из которых имеют три пробела в конце их, которые я хотел бы удалить. Когда я печатаю эти имена в Python, я получаю выход как следует за:file.write() не постоянно записывается в файл python

Adeline Panella  
Winifred Aceto   
See Weckerly  
Daniell Hildebrand  
Betsey Coulter   
#there are about 1000 of these names 

Чтобы удалить лишние пробелы, я написал следующий скрипт:

import os 
script_directory = os.path.dirname(__file__) 
file = open(os.path.join(script_directory, "assets/data/names.txt"), 'r') 
potential_names = file.read().splitlines() 
potential_names = list(filter(None, potential_names)) 
for item in potential_names: 
    print(item) 
    item = item[:-3] 
    print(item) 
file.close() 
file = open(os.path.join(script_directory, "assets/data/names.txt"), 'w') 
for item in potential_names: 
    file.write("{}\n".format(item)) 
file.close() 

Оказывается функционировать, как и следовало ожидать, так как выход заключается в следующем:

Adeline Panella   
Adeline Panella 
Winifred Aceto   
Winifred Aceto 
See Weckerly   
See Weckerly 
Daniell Hildebrand   
Daniell Hildebrand 
Betsey Coulter   
Betsey Coulter 

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

+0

Вот что может быть опрятным: https://gist.github.com/anonymous/6828cdfe74564472160e – Ryan

ответ

4
for item in potential_names: 
    print(item) 
    item = item[:-3] 
    print(item) 

При изменении item на этой третьей строке выше, он делает не отражает обратно в potential_names коллекции, он просто меняет item. Вот почему он, кажется, меняет строку (1).

Однако позже, когда вы обрабатываете коллекции:

for item in potential_names: 

это оригинальных содержимого коллекции вы выводите.

Один из способов обойти это просто построить новый список с последних трех символов, удаленных из каждого пункта:

potential_names = [x[:-3] for x in potential_names] 

(1) Python, как правило, считается чистым объектно-ориентированный язык, потому что все - это объект, к которому относятся имена.

То есть определенные ограничения в том, что выражение item = '12345'; item = item[:-3] не изменяет значение базовых '12345' строки, она создает строку нового и изменяет значение item ссылки ссылаться на него.

Этот аспект языка был настоящим открытием, когда я понял, как он работает.

+0

А, это имеет смысл. Я относительно новичок в python, и предполагаемый 'item' будет ссылкой на элемент внутри списка, а не на локальную копию элемента. – WookieCoder

+1

@WookieCoder: * * ссылка на элемент внутри списка. 'item = item [: - 3]' назначает новую ссылку на 'item'. – Ryan

Смежные вопросы