Python:在线上写作的问题?

时间:2016-08-03 06:44:19

标签: python file io

所以,这是我在Python中用来删除行的代码,因此名称为“cleanse”。我列出了几千个单词及其词性:

  

NN by

     

PP

     

PP

......这就是问题所在。无论出于何种原因(一个我无法弄清楚并且已经尝试了几个小时),我用来通过单词输入的程序没有清除重复项,所以我能做的下一个最好的事情是前任的!你知道,循环浏览文件并删除运行中的重复项。但是,每当我这样做时,此代码将取代列表的最后一行并复制 数十万次。

请注意? :(

编辑:想法是cleanseArchive()通过一个名为words.txt的文件,获取任何重复的行并删除它们。但是,由于Python无法删除行,并且我没有幸运的任何其他方法,我转向基本上保存列表中的非重复数据(saveList),然后从该列表中写入每个对象进入一个新文件(删除旧文件)。然而,就像我说的那样,它只是重复原始列表的最终对象数千次。

EDIT2:这是我到目前为止所做的,从回复中得出建议:

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:\Python33\Scripts\AI\prototypal_intelligence.py", line 154, in <module>
    initialize()
  File "C:\Python33\Scripts\AI\prototypal_intelligence.py", line 100, in initialize
    cleanseArchive()
  File "C:\Python33\Scripts\AI\prototypal_intelligence.py", line 29, in cleanseArchive
    f.write(saveList)
TypeError: must be str, not set

4 个答案:

答案 0 :(得分:1)

t.first.fil

您基本上会一遍又一遍地打印for i in saveList: f.write(n+"\n") 的值。

试试这个:

n

答案 1 :(得分:0)

如果您只想删除“重复的行”,我已修改您的阅读代码:

saveList = []
duplicates = []
with open("words.txt", "r") as ins:
for line in ins:
    if line not in duplicates:
        duplicates.append(line)
        saveList.append(line)

另外采取上述纠正措施!

答案 2 :(得分:0)

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有一些颠簸的路,神圣的狗屎。这么多东西不能用于非常模糊的原因!无论如何,修好它。

答案 3 :(得分:0)

让我们清理您在更新中提供给我们的代码:

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)

我们有不好的名字,不尊重Style Guide for Python Code,我们有多余的代码部分,我们没有使用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)

那就是它。