提问人:TimKostenok 提问时间:8/1/2023 最后编辑:Kolay.NeTimKostenok 更新时间:8/3/2023 访问量:94
如何在不重写文件python的情况下从文件中删除一行的编号
How to remove a line by its number from file without rewriting file python
问:
我需要按编号从文本文件中删除一行,但不重写文件(出于性能原因)。我有一个程序需要经常删除和添加行到文件中。例如,我有包含以下文本的文件:test.txt
Hello, world!
Example
Sample text
Abcdefghijklmnopqrstuvwxyz
Hello,
world!
我需要删除带有数字的行.'Example'
num = 2
我有这个解决方案:
num = 2
with open('test.txt', 'r+') as f:
for i in range(num - 1):
f.readline()
pos = f.tell()
f.readline()
s = f.read()
f.seek(pos)
f.truncate()
f.write(s)
它可以工作,但它会重写文件的其余部分(第 3 行到第 6 行),这可能需要很长时间。
我搜索了 stackoverfow 和 google,但没有找到没有重写的解决方案。
有没有办法不重写文件?另外,为了进行更多优化,如何在不读取文件前缀的情况下通过其编号找到行的位置?
更新:
当我说不要重写文件时,我的意思是重写文件的末尾(删除它然后写它),因为它可能非常大,只需删除该行即可。
@Kolay.Ne ,在一个文件中,我只存储用户的唯一ID,用户可以添加自己或删除自己。我认为txt文件是一个很好的解决方案。
@DarkKnight,我认为我可以将带有零的 ID 填充到某个恒定长度,所以我可以只做(+ 1,因为新的行字符)而不是 .f.seek(num * (length + 1))
for i in range(num - 1): f.readline()
感谢大家的帮助!
答:
如果文本文件上的行具有不同的长度,则获取特定行号的唯一方法是一次读取一行。
在这种情况下,最简单的方法是将所有行读入列表,从该列表中删除相应的元素,然后重写文件。
LINENO = 2
with open('/Volumes/G-Drive/foo.txt', 'r+') as foo:
lines = foo.readlines()
del lines[LINENO-1]
foo.seek(0)
foo.writelines(lines)
foo.truncate()
如果您不想重写文件,则只需将列表保留在内存中(删除了不再需要的行)
有没有办法不重写文件?
不,这是不可能的。通常,文件以物理方式存储在文件系统中,要么作为连续的数据块,要么(假设文件足够大)拆分为几个连续的数据块。因此,从文件中间删除某些内容的任务类似于从内存中的数组中删除中间元素的任务:如果要保留数组的尾部,则必须将其移回。
如何在不读取文件前缀的情况下通过行的编号找到行的位置?
同样,出于同样的原因,这是不可能的:在您的文件系统中,文件存储为字节序列,而不是行序列(诸如 / 之类的方法是一个很好的 Python 接口,它在内部仍然将文件读取为字节序列)。因此,没有 API 来查找行(即使有,在内部它仍然必须读取这些行)。.readline()
.readlines()
(不要问什么)
提供问题的上下文通常是个好主意,其中一个原因是不要以 XY 问题告终。
在您的特定情况下,也许您遇到的技术问题实际上是由于设计不佳而存在的。除其他外,我想知道:
- 你真的需要把这些数据保存在文件中吗?你能把它记在心里吗?如果没有,您能否暂时将其缓存在内存中,并且只是偶尔将其写回?
- 有没有更好的方法来组织您的存储?也许你应该有多个文件来完成你的任务?
As you provide no context, I don't know the answer to any of the above questions and can not recommend a conceptual improvement.
Now that the question is updated, we finally know that what you actually wanted is to track users, and their ids in particular. I assume you also want that storage to be persistent (that is, the users list must remain when your program is restarted).
A good fit for this task is a database. It allows one to store and manipulate data (e.g. ids and any other info you have) about entities (e.g. users) in an application. I would recommend you to start off with SQLite: it is a rather simple relational DBMS, which python supports out of the box, and there's plenty tutorials on the internet (just google something like 'python sqlite quickstart' or 'python sqlite tutorial')
评论
下一个:如何按位置从文件中删除符号
评论
sqlite3