我使用以下代码:
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
我在这里弄错了什么?非常感谢您的帮助!
答案 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)