Python 3.x Python:当csv文件被另一个进程追加时,是否可以读取csv文件中的新行

Python 3.x Python:当csv文件被另一个进程追加时,是否可以读取csv文件中的新行,python-3.x,pandas,csv,pandas-datareader,Python 3.x,Pandas,Csv,Pandas Datareader,我有一个Python(3.6)脚本,它将csv文件中的数据读取到pandas数据帧中,pandas对从csv文件中读取的每一行执行操作 这适用于静态CSV文件,例如,所有要处理的数据都已包含在CSV文件中 我希望能够从另一个Python进程附加到CSV文件中,这样数据就可以连续地馈送到pandas数据帧中,或者,如果将数据馈送到pandas的进程到达文件的末尾,它会等待一个新行附加到CSV文件中,然后继续将行读取到pandas中 这可能吗 我对pandas还不熟悉,目前我很难理解pandas如何

我有一个Python(3.6)脚本,它将csv文件中的数据读取到pandas数据帧中,pandas对从csv文件中读取的每一行执行操作

这适用于静态CSV文件,例如,所有要处理的数据都已包含在CSV文件中

我希望能够从另一个Python进程附加到CSV文件中,这样数据就可以连续地馈送到pandas数据帧中,或者,如果将数据馈送到pandas的进程到达文件的末尾,它会等待一个新行附加到CSV文件中,然后继续将行读取到pandas中

这可能吗

我对pandas还不熟悉,目前我很难理解pandas如何与实时/动态数据一起使用,因为我看到的所有示例似乎都使用静态CSV文件作为数据源

理想情况下,我希望能够直接从消息队列将行馈送到pandas中,但我认为这是不可能的-因此我在想,如果我有第二个Python脚本从队列接收消息,然后将其作为新行附加到CVS文件,则原始脚本可以将其读入pandas中


我是不是误解了pandas的工作原理,或者你能给我一些建议,说明我是否能/如何让这类东西工作吗?

你可以尝试使用pandas read_csv()函数以小块的形式读取大的csv文件,基本代码如下所示:

import pandas as pd
chunksize = 100
for chunk in pd.read_csv('myfile.csv', chunksize=chunksize):
    print(chunk)
请参见此处了解更多信息:


。。。虽然我不完全确定这将如何与非静态文件交互,以及这是否是最佳解决方案。。。控制读取区块距离文件末尾足够远可能是一种解决方案。

您可以尝试使用pandas read_csv()函数以小区块读取大csv文件,基本代码如下所示:

import pandas as pd
chunksize = 100
for chunk in pd.read_csv('myfile.csv', chunksize=chunksize):
    print(chunk)
请参见此处了解更多信息:


。。。虽然我不完全确定这将如何与非静态文件交互,以及这是否是最佳解决方案。。。控制读取区块远离文件末尾可能是一种解决方案。

您可以从队列中弹出逗号分隔的值,并将它们包装到数据帧中

然后,您可以在内存中获取这个微小的数据帧,并将其附加到您想要的任何其他数据帧,这些数据帧也在内存中。您还可以使用.to_csv('whatever',mode='a')将其写入文件

最好不要首先写入csv,并留下一个字符串数组,但因为这更直接地回答了您的问题:

big_df = pandas.read_csv('file.csv')

def handle_csv(csv):
    mini_df = pd.DataFrame([sub.split(",") for sub in csv])
    big_df.append(mini_df)
    mini_df.to_csv("somefile", mode='a')

您可以从队列中弹出逗号分隔的值,并将它们包装到数据帧中

然后,您可以在内存中获取这个微小的数据帧,并将其附加到您想要的任何其他数据帧,这些数据帧也在内存中。您还可以使用.to_csv('whatever',mode='a')将其写入文件

最好不要首先写入csv,并留下一个字符串数组,但因为这更直接地回答了您的问题:

big_df = pandas.read_csv('file.csv')

def handle_csv(csv):
    mini_df = pd.DataFrame([sub.split(",") for sub in csv])
    big_df.append(mini_df)
    mini_df.to_csv("somefile", mode='a')

做了一个快速搜索。。。编写自己的尾部函数来迭代行,并按照此处显示的方式跟踪新行,这可能是另一条路线。。。只要用您选择的任何方法将输出数据写入dataframe…谢谢您的建议,我不确定这是否适用于我的具体情况,因为新行将每隔x秒/分钟写入一次,因此我不能使用分块来避免在写入新行之前到达文件的末尾……python日志功能有一些希望。它正是为这种情况而设计的(捕获实时数据)。它为您处理缓冲和文件管理。Pandas设计用于高效读取大型数据文件。使用这两种方法可以解决您的数据管理问题。此外,这将为您提供一份数据副本,以供以后参考。再次感谢您的建议-我将对此进行调查,并返回给您!最后查看HDF5/pytables。。。看到这个答案,我做了一个快速搜索。。。编写自己的尾部函数来迭代行,并按照此处显示的方式跟踪新行,这可能是另一条路线。。。只要用您选择的任何方法将输出数据写入dataframe…谢谢您的建议,我不确定这是否适用于我的具体情况,因为新行将每隔x秒/分钟写入一次,因此我不能使用分块来避免在写入新行之前到达文件的末尾……python日志功能有一些希望。它正是为这种情况而设计的(捕获实时数据)。它为您处理缓冲和文件管理。Pandas设计用于高效读取大型数据文件。使用这两种方法可以解决您的数据管理问题。此外,这将为您提供一份数据副本,以供以后参考。再次感谢您的建议-我将对此进行调查,并返回给您!最后查看HDF5/pytables。。。如果您控制可能将数据附加到CSV的流程,那么为什么不让该流程通过web服务或其他方式将新数据传递给另一个流程呢?假设进程A使用熊猫,读取数据缓存并做出反应。进程B可以通过附加到该共享CSV或通过写入A知道要检查的另一个位置来与进程A通信,或者让A直接请求B提供数据。感谢您的评论-我是pandas/python新手,因此需要花一点时间来理解这一点,以完全理解它,并看看我是否/如何实现它…如果您控制可能将数据附加到CSV的过程,为什么不让该进程通过web服务或其他方式将新数据传递给另一个进程?假设进程A使用熊猫,读取数据缓存并做出反应。进程B可以通过附加到该共享CSV或通过写入A知道要检查的另一个位置来与进程A通信,