我有一个场景可以使用 Python 中的搜索删除文件的第一行(大约 70 GB 的大文件)。我也无法将数据写入另一个文件。我只需要从现有文件中删除。有什么解决办法吗
尝试将指针移动到行尾,但不确定如何删除它。
可以将文件内存映射到内存中出现的文件内容,然后从第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
不幸的是,不可能立即删除它,但你可以试试这个代码。 这将基本上重写同一个文件中除了第一行之外的内容:
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 就地修改文件,而不是创建新文件。