Python 从文件中逐行读取并同时处理行?

Python 从文件中逐行读取并同时处理行?,python,Python,是否有一种方法可以在处理这些行的同时从文件中读取这些行。因此,读取和处理将彼此分开进行。无论何时读取数据,它都会为处理提供数据,因此无论处理速度有多快,都会始终进行读取。这取决于您所说的“同时”是什么意思。让我们假设您不一定要进入多线程、绿色线程或基于事件的代码的兔子洞,您只想在实际业务逻辑中清晰地分离这些行的读取、过滤/处理这些行以及使用这些行 这可以通过迭代器和生成器(后者是一种特殊的iterable)轻松实现。从open()调用返回的文件对象本身可用作迭代器,这使它变得容易得多 考虑一下这

是否有一种方法可以在处理这些行的同时从文件中读取这些行。因此,读取和处理将彼此分开进行。无论何时读取数据,它都会为处理提供数据,因此无论处理速度有多快,都会始终进行读取。

这取决于您所说的“同时”是什么意思。让我们假设您不一定要进入多线程、绿色线程或基于事件的代码的兔子洞,您只想在实际业务逻辑中清晰地分离这些行的读取、过滤/处理这些行以及使用这些行

这可以通过迭代器和生成器(后者是一种特殊的iterable)轻松实现。从
open()
调用返回的
文件
对象本身可用作迭代器,这使它变得容易得多

考虑一下这个简单的生成器表达式链接(当然,它是一种iterable),它预过滤读取行:

f=open('file-with-myriads-of-lines.txt','r')
#去掉尾随空格(包括换行符)
lines_stripped=(f中的行的line.rstrip())
#删除尾随的“#”注释(注意:忽略可能的引用)
不带注释的行_=(行中的行的行的行.partition('#')[0]
#删除周围剩余的空白
lines\u cleaned=(line.strip()用于不带注释的行中的行)
#过滤掉(现在)空行
内容为的行(行中的行中的行,如果行已清理)
对于包含内容的行中的行:
#你的商业逻辑在这里
打印(“行:{}”。格式(行))
虽然您可以将一些过滤/破坏组合到一个生成器表达式中,或者将其放入for循环中,但通过这种方式,任务可以清晰地分离,您可以通过重新排序、删除或向链中添加更多生成器来轻松地混合和匹配

这也仅在需要时读取和处理每一行,只要在业务逻辑for循环中使用一行(也可以隐藏在其他地方的单独函数中)。它不会预先读取所有行,也不会创建包含所有中间结果的中间列表。这与列表理解相反,列表理解是用方括号而不是括号写的

当然,您也可以以函数的形式为每个处理单元命名,以提高可读性、封装性和可维护性:

def strip_training_空白(iterable):
返回(iterable中的行的line.rstrip())
def删除尾随注释(iterable):
返回(iterable中的行的line.partition('#')[0]
# ...
def预处理_行(iterable):
iterable=带尾随空格(iterable)
iterable=删除尾随注释(iterable)
# ...
可返回
def业务逻辑(iterable):
对于iterable中的行:
#您的业务逻辑在这里
打印(“行:{}”。格式(行))
def main():
将open('file-with-myriads-of-lines.txt','r')作为f:
iterable=预处理_行(f)
业务逻辑(iterable)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
如果您对每一行的预处理比生成器表达式中可用的内容更复杂,您可以使用
yield
语句或表达式将其扩展为自定义生成器函数:

def删除尾随注释(iterable):
“”“删除双引号部分之外的#-注释。”“”
对于iterable中的行:
位置=-1
尽管如此:
pos=行。查找(“#”,pos+1)
如果位置<0:
中断#使用整条线路
如果行[:pos].count(“”)%2==0:
#从第一个“#”开始,不在引号内
行=行[:位置]
打破
生产线

其他一切都保持不变。

您可以在单独的线程上执行读取操作,并使用
线程。队列
将数据传递到主线程。您想实现什么?速度提高?