在Python中使用seek删除第一行

ldioqlga  于 2023-05-19  发布在  Python
关注(0)|答案(2)|浏览(155)

我有一个使用Python中的seek删除文件(大约70 GB的大文件)的第一行的场景。我也不能将数据写入另一个文件。我只需要从现有文件中删除。有没有解决办法。
试图将指针移动到行尾,但不确定如何删除它。

3bygqnnd

3bygqnnd1#

您可以将文件的内存Map到出现在内存中的文件的内容,然后将内存从第2行开始移动到文件的开头。然后将文件截断为新文件长度。
对于70GB的文件来说,这可能不会太快。它仍然需要将文件更改刷新回磁盘。这只是文件的工作方式,但它不需要额外的70GB磁盘空间,如编写新文件和删除旧文件的常规过程。

import mmap

# Create test file for demonstration (about 50MB)
#
# The quick brown fox jumped over 1 lazy dogs
# The quick brown fox jumped over 2 lazy dogs
# ...
# The quick brown fox jumped over 1,000,000 lazy dogs

with open('test.txt', 'w') as f:
    for i in range(1, 1_000_001):
        print(f'The quick brown fox jumped over {i:,} lazy dogs', file=f)

# Create memory-mapped file, read first line, shift file memory
# starting from offset of the 2nd line back to the beginning of the file.
# This removes the first line.
with open('test.txt', 'r+b') as f:
    with mmap.mmap(f.fileno(), 0) as mm:
        size = mm.size()
        line = mm.readline()
        linelen = len(line)
        mm.move(0, linelen, size - linelen)
        mm.flush()

    # Truncate the file to the shorter length.
    f.truncate(size - linelen)

# Read the first line of the new file.
with open('test.txt') as f:
    print(f.readline())

输出:

The quick brown fox jumped over 2 lazy dogs
kqqjbcuj

kqqjbcuj2#

不幸的是,它是不可能立即删除它,但uou可以尝试这个代码。这将基本上重写同一文件中的内容,除了第一行:

import fileinput

with fileinput.input(files=('text.txt'), inplace=True) as f:
    for line_number, line in enumerate(f):
       if line_number == 0:
           continue
       print(line, end='')

inplace=True参数告诉Python修改文件,而不是创建一个新文件。

相关问题