最好读取整个文件,将其关闭,然后在其上循环播放,或者在打开时循环播放?

ruo*_*ola 2 python file file-read python-3.x

我想知道,哪一种是逐行处理文件内容的更好,更安全的方法。这里的假设是文件的内容非常重要,但是文件不是很大,因此内存消耗不是问题。

最好使用以下方法尽快关闭文件:

with open('somefile.txt') as f:
    lines = f.readlines()

for line in lines:
    do_something(line)
Run Code Online (Sandbox Code Playgroud)

或一口气遍历它:

with open('somefile.txt') as f:
    for line in f:
        do_something(line)
Run Code Online (Sandbox Code Playgroud)

通常,以下哪种做法是更好且更容易接受的方式?

fre*_*ish 7

没有“更好”的解决方案。仅仅因为这两个远非等同。

第一个将整个文件加载到内存中,然后处理内存中的数据。这具有根据处理内容而更快的潜在优势。请注意,如果文件大于您所拥有的RAM数量,那么这根本不是一个选择。

第二个文件仅将文件的一部分加载到内存中,进行处理,然后加载另一部分,依此类推。通常这比较慢(尽管您可能看不到差异,因为通常处理时间(尤其是在Python中,占主导地位的是读取时间))却大大减少了内存消耗(假设您的文件多于1行)。同样在某些情况下,使用它可能会更加困难。例如,假设您正在xy\nz文件中寻找特定的模式。现在,通过“逐行”加载,您必须记住上一行才能进行正确的检查。这比较难实现(但只有一点点)。再说一遍:这取决于您在做什么。

如您所见,存在一些折衷,哪个更好取决于您的上下文。我经常这样做:如果文件相对较小(例如几百兆),则将其加载到内存中。

现在您已经提到内容是“关键的”。我不知道这是什么意思,但是例如,如果您尝试对文件进行原子更新或在进程之间读取一致,那么这与您发布的问题完全不同。而且通常很难,因此我建议使用适当的数据库。SQLite是一个简单的选项(再次:取决于您的方案),类似于拥有文件。

  • 文件迭代器本身已经在执行一些缓冲了。您实际上并不是一次从磁盘读取一行。 (2认同)