所以,这是我在Python中用来删除行的代码,因此得名"clean"
的NN
的PP
的PP
这就是问题所在。无论出于什么原因(我想不通,已经试了几个小时了),我用来检查单词输入的程序没有清除重复项,所以我能做的下一件最好的事情就是前者!你知道,循环浏览文件并在运行时删除重复项。然而,每当我这样做时,这段代码都会占用列表的最后一行,并将复制数十万次。
想一想?:(
编辑:这个想法是cleanseArchive()通过一个名为words.txt的文件,获取任何重复的行并删除它们。不过,由于Python不能删除行,而且我在其他方法上也没有运气,所以我转而将不重复的数据保存在列表中(saveList),然后将该列表中的每个对象写入一个新文件(删除旧文件)。然而,就在我所说的那一刻,它只是将原始列表的最终对象重复了成千上万次。
第二版:这是我到目前为止所得到的,从回复中得到建议:
def cleanseArchive():
f = open("words.txt", "r+")
given_line = f.readlines()
f.seek(0)
saveList = set(given_line)
f.close()
os.remove("words.txt")
f = open("words.txt", "a")
f.write(saveList)
但是ATM给了我一个错误:
Traceback (most recent call last):
File "C:Python33ScriptsAIprototypal_intelligence.py", line 154, in <module>
initialize()
File "C:Python33ScriptsAIprototypal_intelligence.py", line 100, in initialize
cleanseArchive()
File "C:Python33ScriptsAIprototypal_intelligence.py", line 29, in cleanseArchive
f.write(saveList)
TypeError: must be str, not set
for i in saveList:
f.write(n+"n")
您基本上一遍又一遍地打印n
的值。
试试这个:
for i in saveList:
f.write(i+"n")
如果你只想删除"重复的行",我已经修改了你的阅读代码:
saveList = []
duplicates = []
with open("words.txt", "r") as ins:
for line in ins:
if line not in duplicates:
duplicates.append(line)
saveList.append(line)
另外,请进行上述更正!
def cleanseArchive():
f = open("words.txt", "r+")
f.seek(0)
given_line = f.readlines()
saveList = set()
for x,y in enumerate(given_line):
t=(y)
saveList.add(t)
f.close()
os.remove("words.txt")
f = open("words.txt", "a")
for i in saveList: f.write(i)
成品!我最终深入研究了枚举,基本上只是用它来获取字符串。伙计,当你进入布景/列表时,Python会有一些崎岖不平的道路,天哪。这么多东西因为非常模糊的原因而不起作用!不管是什么情况,都要解决。
让我们清理一下您在更新中给我们的代码:
def cleanseArchive():
f = open("words.txt", "r+")
given_line = f.readlines()
f.seek(0)
saveList = set(given_line)
f.close()
os.remove("words.txt")
f = open("words.txt", "a")
f.write(saveList)
我们有不尊重Python代码风格指南的坏名字,我们有多余的代码部分,我们没有使用Python的全部功能,其中一部分不起作用。
让我们从删除不需要的代码开始,同时使用有意义的名称。
def cleanse_archive():
infile = open("words.txt", "r")
given_lines = infile.readlines()
words = set(given_lines)
infile.close()
outfile = open("words.txt", "w")
outfile.write(words)
不需要seek
,打开文件读取的模式现在只是r
,写入的模式现在是w
,我们放弃了删除文件,因为它无论如何都会被覆盖。看看这个现在更清晰的代码,我们看到,我们错过了在编写后关闭文件的机会。如果我们用with
语句打开文件,Python会帮我们处理这个问题
def cleanse_archive():
with open("words.txt", "r") as infile:
words = set(infile.readlines())
with open("words.txt", "w") as outfile:
outfile.write(words)
现在我们有了清晰的代码,我们将处理调用outfile.write
时出现的错误消息:TypeError: must be str, not set
。这条消息很明确:您不能将集合直接写入文件。显然,您必须循环浏览集合的内容。
def cleanse_archive():
with open("words.txt", "r") as infile:
words = set(infile.readlines())
with open("words.txt", "w") as outfile:
for word in words:
outfile.write(word)
就是这样。