我有一个名称的文本文件,所有文件都在它们的末尾有三个空格,我想删除它们。当我在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 :(得分:4)
for item in potential_names:
print(item)
item = item[:-3]
print(item)
当您在上面第三行更改item
时,不会反映回potential_names
集合,它只会更改item
。这就是为什么它似乎在修改字符串(1)。
但是,稍后,当您处理集合时:
for item in potential_names:
这是您输出的集合的原始内容。
解决此问题的一种方法是简单地构建一个 new 列表,其中从每个项目中删除最后三个字符:
potential_names = [x[:-3] for x in potential_names]
(1) Python通常被认为是一种纯粹的面向对象语言,因为所有是一个名称所引用的对象。
这有一些限制,因为表达式item = '12345'; item = item[:-3]
不会更改基础'12345'
字符串的值,它会创建一个 new 字符串并更改其值item
引用它。
一旦我弄清楚它是如何运作的,那语言的这个方面真是令人大开眼界。