使用Python删除文件中的行会产生错误

时间:2018-10-23 16:46:23

标签: python

我使用以下代码:

with open("engl_bible.txt", 'r') as f:
    new_f = f.readlines()
    for line in new_f:
        if "#" not in line:
            f.write(line)
f.truncate()
print(f)

删除以#开头的行,但会产生以下错误

f.write(line)
io.UnsupportedOperation: not writable

我在这里弄错了什么?非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

这是我能给您的最短答案,似乎很有效:

with open("engl_bible.txt", 'r+') as f:
    lines = f.readlines()
    f.seek(0)
    f.truncate()
    for line in lines:
        if "#" in line: continue

        f.write(line)

您需要以读写模式打开文件,在读取文件之后,您需要确保自己站在开头并截断文件以确保没有任何尾随文本。

然后,继续遍历已读的所有行,并写出要写的行。

有更好的方法,但这可以解决您的问题,并希望您能学到一些有关文件句柄的知识。

您遇到的问题是@Austin指出您的文件处于读取模式。意思是你不能写。您不能仅在写入模式下打开它,因为这将使其无法读取。 r+随即打开,以供阅读和书写。

请记住,读完文件中的每个字符后,“标记”位置将向前移动一个字符。因此,在阅读时写东西有些棘手且危险[em>(但这可能会加快速度)。因此,最简单的方法是读取整个文件,然后跳回到开头并完成您想要做的工作。

其他方法是读取每一行,检查是否需要,否则,跳回一行,替换该行。但随后您将不得不担心尾随数据或数据被部分替换等。无论如何,请记住这一点。


正如@Swift指出的,我的一个老习惯是在循环的顶部执行“如果X则跳过” 逻辑,这样我就知道该块中的所有代码都是应该执行,并且只与任务有关,而不是后面有很多if案例。

无论如何,代码也可以缩短为:

with open("engl_bible.txt", 'r+') as f:
    lines = f.readlines()
    f.seek(0)
    f.truncate()
    for line in lines:
        if not "#" in line:
            f.write(line)

它将执行相同的操作。自从提出问题以来,我以为我会把它扔在那里。

答案 1 :(得分:0)

with open("engl_bible.txt", 'rt') as f:
    new_f = f.readlines()
    for line in new_f:
        if "#" not in line:
            f.write(line) #The problem is here, you open in read mode but attempt to write to the file.
f.truncate()

print(f)

您的代码中的问题是由于第一行。如评论部分所述,您要求Python以只读模式打开文件。这意味着您可以从中获取数据,但无法对其进行写入。

我的建议是在写模式下(写文本或写二进制wt or wb

打开它)

如果您确实必须编写文件,我还建议您创建一个新文件,而不是覆盖旧文件,然后视情况归档或删除该旧文件。

为此,请遵循以下代码:

important_lines = []
with open("engl_bible.txt", 'rt') as f:
    new_f = f.readlines()
    for line in new_f:
        if "#" not in line:
            important_lines.append(line)
f.truncate()

print(f)
with open("engl_bible_cleaned.txt", 'wt+') as f:
    for item in important_lines:
        f.write(item)

答案 2 :(得分:-1)

打开文件,得到各行,然后以写模式重新打开文件,这将截断文件并将所需的数据写入其中。

with open("t.txt", 'r+t') as f:
   new_f = f.readlines()
with open("t.txt", 'wt') as f:
   for line in new_f:
     if "#" not in line:
     f.write(line)