【问题标题】:Delete a line from a file in-place从文件中就地删除一行
【发布时间】:2014-11-25 09:34:48
【问题描述】:

我有一个 .txt,我想要一个 python 脚本来处理它。

我的 .txt 看起来像这样:

  • 27b23815-4cbb-dfae-3e6d-38f67ec4266e
  • 81a090bd-8973-bc37-5c7b-dc1a18e8ddee
  • 7e1bf596-88bc-d8fd-9aea-278d5c689eaa
  • 0b365fb0-dea4-53a1-fd27-6cbf9721602c
  • 1c317dcf-73f4-edf5-b6a1-ad663d2b507e
  • 6db8342d-1afb-2777-1a7f-a5daad06d2db

如果第 6 行有任何内容,我想删除 .txt 的第一行,但所有这些都没有从旧的 .txt 中创建新的。不能完全掌握这个:(

我知道我可以删除第一行:

       lines = file(idpath, "r").readlines()  
       del lines[0]  
       file(idpath,"w").writelines(lines) 

感谢任何帮助

【问题讨论】:

  • 如何展示你做了什么?
  • 看起来更像是一个家庭作业:P
  • 不,这不是家庭作业:D。我运行 XenServer 并试图删除我的 VM 的快照。一旦有第 6 个快照,我想最早删除,因此我需要第一个快照的 ID,即 .txt 的第一行。除了第 6 行的 if 语句之外,所有这些都有效。
  • Shell 语言会更容易做到这一点
  • 当然可以,但我想用 Python 来做,因为我有其他 Python 脚本,我想只使用一种语言

标签: python io


【解决方案1】:

由于文件范例是一个(可调整大小的)字节数组,您不能简单地从内部删除数据。相反,您可以执行以下任一操作:

  • 向后滑动要删除的片段后面的所有数据以覆盖它,然后调整文件的大小
    (老式,通常用于内存映射文件或当您无法负担另一个副本时数据)
  • 将所有结果数据写入一个新文件,然后将其移到旧文件上
    (在批处理中很常见,因为 move 在同一文件系统中是原子且即时的,可能有效(取决于OS),即使文件被其他东西打开,您也可以在应用更改之前检查结果)
  • 将您需要保存的所有数据读入内存,然后将文件截断为零字节并写入新数据
    (通常用于文本编辑器。文件无法打开以供其他东西写入,并且在你截断它的那一刻,旧的内容就会丢失。OTOH,你不需要创建另一个文件并覆盖这个文件的权限)

至于列表操作,RTM Sequence types

【讨论】:

  • 但是我可以从 .txt 中删除一些内容,因为我已经在上面发布了 3 行。难道不能做类似的事情:如果行[6]是空的:做某事
  • 是的,您使用的是第三个选项。
【解决方案2】:

我想通了!现在我看到了,这很简单

 f = open('file','r')  
 lines = f.readlines()
 if lines[5]: del lines[0]

【讨论】:

  • lines[5] 将在少于 6 行时引发 IndexError。 (程序将立即退出,所以这可能与您无关)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 2020-07-18
相关资源
最近更新 更多