我正在使用 Linux,并且正在编写一个编辑 Thunar 书签的脚本,但我遇到了一些问题。
我有以下Python代码:
if os.path.exists("/home/user/.config/gtk-3.0/bookmarks"):
with open("/home/user/.config/gtk-3.0/bookmarks", 'r') as self.file:
self.bookmarks = self.file.readlines()
for i in range(len(self.bookmarks)):
if "/home/user/MyBookmark" in self.bookmarks[i]:
self.bookmarks.pop(i)
print(self.bookmarks)
file.close()
with open("/home/user/.config/gtk-3.0/bookmarks", 'w') as file:
for bookmark in self.bookmarks:
print(bookmark)
file.write(bookmark)
file.close()
它的作用基本上是从
MyBookmark
书签中删除 thunar
,此代码位于 PySide6 脚本中,并且它不能完全工作,它在我启动程序时执行,并且按预期删除书签,但作为一旦我结束执行,书签就会恢复并且MyBookmark
返回。
这是整个脚本中我唯一一次触摸书签。
我发现只有当我在运行程序时打开
thunar
时才会出现此问题,所以我这样做了
os.system('killall thunar 2>/dev/null')
在运行更改它的部分之前,它可以工作,但由于显而易见的原因,这不是最好的解决方案。
有人知道可能导致此问题的原因吗?有其他解决方案吗?
在您的代码中,当您弹出索引时,它会删除列表元素并将所有内容向上移动,这会让您错过下一个项目。这是一个演示。假设您的文件如下所示:
foo
bar
/home/user/MyBookmark/1
/home/user/MyBookmark/2
last
当您在索引 2 处弹出时,列表变为
foo
bar
/home/user/MyBookmark/2
last
然后您将转到索引 3,这意味着您没有处理 ../MyBookmark/2 行。
这里有一个修复:使用列表理解:
with open("bookmarks") as stream:
lines = [line for line in stream if "/home/user/MyBookmark" not in line]
with open("bookmarks", "w") as stream:
stream.writelines(lines)
第一个
with
块将收集所有不包含特定文本的行。然后下一个块写出这些行。