在 Python 中使用 seek 删除第一行

问题描述 投票:0回答:2

我有一个场景可以使用 Python 中的搜索删除文件的第一行(大约 70 GB 的大文件)。我也无法将数据写入另一个文件。我只需要从现有文件中删除。有什么解决办法吗

尝试将指针移动到行尾,但不确定如何删除它。

python python-3.x seek
2个回答
0
投票

可以将文件内存映射到内存中出现的文件内容,然后从第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

-1
投票

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

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 就地修改文件,而不是创建新文件。

© www.soinside.com 2019 - 2024. All rights reserved.