Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最好读取整个文件,关闭它,然后在其上循环,或者在它运行时循环';什么地方开门?_Python_Python 3.x_File_File Read - Fatal编程技术网

Python 最好读取整个文件,关闭它,然后在其上循环,或者在它运行时循环';什么地方开门?

Python 最好读取整个文件,关闭它,然后在其上循环,或者在它运行时循环';什么地方开门?,python,python-3.x,file,file-read,Python,Python 3.x,File,File Read,我想知道,哪一种是逐行处理文件内容的更好、更安全的方法。这里的假设是,文件的内容非常关键,但文件不是很大,因此内存消耗不是问题 是否最好使用以下方法尽快关闭文件: with open('somefile.txt') as f: lines = f.readlines() for line in lines: do_something(line) 或者只需一次循环: with open('somefile.txt') as f: for line in f:

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

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

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

for line in lines:
    do_something(line)
或者只需一次循环:

with open('somefile.txt') as f:
    for line in f:
        do_something(line)
这些做法中,哪一种通常是更好、更被接受的做法?

没有“更好”的解决方案。仅仅是因为这两者远远不相等

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

第二个只将文件的一部分加载到内存中,对其进行处理,然后加载另一部分,依此类推。这通常比较慢(尽管您可能看不到区别,因为处理时间(尤其是Python中的处理时间)通常会支配读取时间),但会大大减少内存消耗(假设文件有多行)。此外,在某些情况下,可能更难处理。例如,假设您正在文件中查找特定图案
xy\nz
。现在,通过“逐行”加载,您必须记住上一行,以便进行正确的检查。这更难实现(但只有一点)。所以再说一遍:这取决于你在做什么

正如您所看到的,存在权衡,更好的选择取决于您的上下文。我经常这样做:若文件相对较小(比如几百兆字节),那个么将其加载到内存中


现在您已经提到内容是“关键的”。我不知道这意味着什么,但例如,如果您试图对文件原子进行更新,或者在进程之间读取一致,那么这与您发布的问题截然不同。通常很难,所以我建议使用合适的数据库。SQLite是一个简单的选项(同样:取决于您的场景),类似于拥有一个文件。

如果您谈论的是一个大文件,第二种方法在内存使用方面可能更有效,因为您事先不存储整行。@Austin,OP说内存不是问题。然而,OP提到了关键性,想到的第一个问题是回滚/退出。如果出现问题,处理文件的全部内容并退出整个文件是否更好?或者,处理文件的某些内容更好吗?如果确实发生问题,那么您是回滚提交的行,还是对已处理的行没有问题,只是重播其余的行?我认为确定文件的关键性(关于如何处理失败事件)将促使您选择循环;对于文件的只读访问,使用文件迭代器还是列表迭代器进行迭代并不重要。这只是内存管理的问题;您并不是一次从磁盘读取一行数据。@chepner当然,还有操作系统缓存和磁盘缓存。此外,文件可能已经在RAM中(即RAM磁盘)。但这些都是实现细节。总的想法是一样的:你只从某个地方(无论在哪里)读一篇文章。不是所有的。是的,但是它把内存管理的细节留给了其他人。相比之下,交错处理I/O的开销不太可能使将整个文件读入内存的速度明显加快。@chepner我不反对这一点,因为老实说,我还没有测量速度。我对答案做了一些修改,还添加了“难度”作为反对“逐行阅读”的论点。