下面的代码是否有任何替代方案:
startFromLine = 141978 # or whatever line I need to jump to
urlsfile = open(filename, "rb", 0)
linesCounter = 1
for line in urlsfile:
if linesCounter > startFromLine:
DoSomethingWithThisLine(line)
linesCounter += 1
如果我正在处理一个巨大的文本文件
(~15MB)
,其行长度未知但不同,并且需要跳转到我事先知道的特定行?当我知道我至少可以忽略文件的前半部分时,我对逐一处理它们感到很糟糕。寻找更优雅的解决方案(如果有)。
对于大文件,逐行迭代会很慢。 可以使用以下方法更有效地跳转到 Python 中的大型文本文件中的特定行:
1. 使用
linecache
模块
linecache
模块允许通过行号获取特定行,而无需读取整个文件。 这对于读取文件中的随机行非常有效。
import linecache
startFromLine = 141978
line = linecache.getline(filename, startFromLine)
if line: # 处理空行的可能性
DoSomethingWithThisLine(line)
2. 使用文件指针操作和
seek()
(对于已知行分隔符)
如果知道行分隔符(例如,
\n
用于换行)并且行长度变化很大,可以通过估计每个字符的平均字节大小来优化文件指针操作:
import os
startFromLine = 141978
estimated_line_size = 100 # 调整此估计值
with open(filename, "rb") as urlsfile:
# 粗略估计要跳过的字节数
urlsfile.seek((startFromLine - 1) * estimated_line_size)
# 读取并丢弃可能不完整的行
urlsfile.readline()
# 从下一行开始处理
for line in urlsfile:
DoSomethingWithThisLine(line.decode("utf-8"))
重要注意事项:
-
行分隔符:
这些方法假定默认行分隔符(
\n
)。 如果的文件使用不同的分隔符,请相应地调整代码。 -
编码:
将
encoding
参数调整为文件使用的实际编码(如果适用)。 -
性能:
linecache
更适合随机行访问,而文件指针操作更适合顺序读取。
通过使用这些方法,可以避免对大型文本文件进行不必要的迭代,从而显着提高代码的性能。 选择最适合特定需求和文件特征的方法。
标签:python,text-files From: 620367