用Python删除文件中的行会生成

2024-05-17 10:17:54 发布

您现在位置: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

我做错什么了?非常感谢你的帮助!你知道吗


Tags: 代码intxtnewforifaswith
3条回答

这是我能给你的最简短的答案,似乎是可行的:

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指出的,你的文件处于读取模式。意思是你不能给它写信。你不能只在写模式下打开它,因为那样会使它无法读取。其中asr+为读写同时打开。你知道吗

请记住,在文件中读取每个字符后,“标记”位置将向前移动一个字符。所以边读边写有点棘手和危险(但这可能会加快速度)。因此,最简单的方法是读取整个文件,然后跳回到开头,做你想做的工作。你知道吗

其他的方法是读每一行,检查是否需要,如果不需要,跳回一行,替换那一行。但是,您将不得不担心后续数据或数据被部分替换等问题。无论如何,请记住这一点。你知道吗


正如@Swift所指出的,我的一个老习惯是在循环的顶部执行“skip if 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)

它也会这样做。我想既然有人提出这个问题我就把它扔进去。你知道吗

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)

打开文件获取行,然后以写模式重新打开文件,这将截断文件并将所需数据写入其中。你知道吗

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)

相关问题 更多 >