最好是读取整个文件,关闭它,然后遍历它,或者在它打开时循环遍历?
Better to read the whole file, close it, and then loop over it, or loop over while it's open?
我想知道,其中哪一种是逐行处理文件内容的更好、更安全的方法。这里假设文件内容很关键,但是文件不是很大,所以内存消耗不是问题。
使用这个尽快关闭文件是否更好:
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)
这些做法中哪一个通常更好、更被接受?
没有"better"解决方案。仅仅因为这两者 远 不等价。
第一个将整个文件加载到内存中,然后处理内存中的数据。这具有更快的潜在优势,具体取决于处理的内容。请注意,如果文件大于您拥有的 RAM 数量,那么这根本不是一个选项。
第二个仅将文件的一部分加载到内存中,对其进行处理,然后加载另一部分,依此类推。这通常较慢(尽管您可能不会看到差异,因为处理时间,尤其是 Python 中的处理时间通常主导读取时间)但会大大减少内存消耗(假设您的文件超过 1 行).同样在某些情况下,它可能更难处理。例如,假设您正在文件中查找特定模式 xy\nz
。现在加载 "line by line" 你必须记住上一行才能进行正确的检查。哪个更难实现(但只有一点点)。再说一遍:这取决于你在做什么。
如您所见,需要权衡取舍,哪种更好取决于您的环境。我经常这样做:如果文件相对较小(比如最多几百兆字节),则将其加载到内存中。
现在您提到的内容是"critical"。我不知道那是什么意思,但是例如,如果您尝试对文件进行原子更新或在进程之间读取一致,那么这与您发布的问题完全不同。而且通常很难,所以我建议使用合适的数据库。 SQLite 是一个简单的选项(同样:取决于您的情况)类似于拥有一个文件。
我想知道,其中哪一种是逐行处理文件内容的更好、更安全的方法。这里假设文件内容很关键,但是文件不是很大,所以内存消耗不是问题。
使用这个尽快关闭文件是否更好:
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)
这些做法中哪一个通常更好、更被接受?
没有"better"解决方案。仅仅因为这两者 远 不等价。
第一个将整个文件加载到内存中,然后处理内存中的数据。这具有更快的潜在优势,具体取决于处理的内容。请注意,如果文件大于您拥有的 RAM 数量,那么这根本不是一个选项。
第二个仅将文件的一部分加载到内存中,对其进行处理,然后加载另一部分,依此类推。这通常较慢(尽管您可能不会看到差异,因为处理时间,尤其是 Python 中的处理时间通常主导读取时间)但会大大减少内存消耗(假设您的文件超过 1 行).同样在某些情况下,它可能更难处理。例如,假设您正在文件中查找特定模式 xy\nz
。现在加载 "line by line" 你必须记住上一行才能进行正确的检查。哪个更难实现(但只有一点点)。再说一遍:这取决于你在做什么。
如您所见,需要权衡取舍,哪种更好取决于您的环境。我经常这样做:如果文件相对较小(比如最多几百兆字节),则将其加载到内存中。
现在您提到的内容是"critical"。我不知道那是什么意思,但是例如,如果您尝试对文件进行原子更新或在进程之间读取一致,那么这与您发布的问题完全不同。而且通常很难,所以我建议使用合适的数据库。 SQLite 是一个简单的选项(同样:取决于您的情况)类似于拥有一个文件。