我试图模拟使用熊猫来访问一个不断变化的文件。
我有一个文件读取一个csv文件,在其中添加一行,然后随机休眠一段时间来模拟批量输入。
import pandas as pd
from time import sleep
import random
df2 = pd.DataFrame(data = [['test','trial']], index=None)
while True:
df = pd.read_csv('data.csv', header=None)
df.append(df2)
df.to_csv('data.csv', index=False)
sleep(random.uniform(0.025,0.3))第二个文件是通过输出dataframe的形状来检查数据的更改:
import pandas as pd
while True:
df = pd.read_csv('data.csv', header=None, names=['Name','DATE'])
print(df.shape)这方面的问题是,当我得到正确的DF形状时,在某些时候它会输出(0x2)。
即:
...
(10x2)
(10x2)
...
(10x2)
(0x2)
(11x2)
(11x2)
...这种情况确实发生在形状的每个更改(添加到dataframe的文件)之间,但不是在此之间。
如果第一个脚本打开文件以添加数据,而第二个脚本无法访问它,因此(0x2),这会发生数据丢失吗?
我不能直接访问流,只能访问输出文件。或者有没有其他可能的解决方案?
编辑
这样做的目的是只加载新数据(我有这样做的代码)并进行“动态”分析。其中一些分析将包括输出/秒、图形化(类似于流图)以及很少的其他数值计算。
最大的问题是,我只有访问csv文件,我需要能够分析数据,因为它来了没有损失或延迟。
发布于 2015-10-30 05:16:37
其中一个脚本正在读取文件,而另一个脚本则试图写入该文件。两个脚本不能同时访问该文件。就像在注释中说的那样,您可以实现一个锁文件来解决这个问题。
有一个python包将执行名为锁文件和Documents这里的操作。
下面是实现了锁文件包的第一个脚本:
import pandas as pd
from time import sleep
import random
from lockfile import FileLock
df2 = pd.DataFrame(data = [['test','trial']], index=None)
lock = FileLock('data.lock')
while True:
with lock:
df = pd.read_csv('data.csv', header=None)
df.append(df2)
df.to_csv('data.csv', index=False)
sleep(random.uniform(0.025,0.3))下面是第二个脚本,它实现了锁文件包:
import pandas as pd
from time import sleep
from lockfile import FileLock
lock = FileLock('data.lock')
while True:
with lock:
df = pd.read_csv('data.csv', header=None, names=['Name','DATE'])
print(df.shape)
sleep(0.100)我增加了100 to的等待,这样就可以减缓控制台的输出速度。
这些脚本将在访问"data.lock“文件之前创建一个名为"data.csv”的文件,并在访问"data.csv“文件后删除"data.lock”文件。在这两个脚本中,如果存在"data.lock“,脚本将等待"data.lock”文件不再存在。
发布于 2015-10-31 02:55:10
您的模拟脚本读写data.csv文件。如果一个脚本只以写方式打开文件,而另一个脚本以只读方式打开文件,则可以并发地进行读写。
考虑到这一点,我将您编写该文件的模拟脚本更改为:
from time import sleep
import random
while(True):
with open("data.csv", 'a') as fp:
fp.write(','.join(['0','1']))
fp.write('\n')
sleep(0.010)在python中,打开带有“a”的文件意味着只将其追加为写文件。使用'a+‘将附加读和写访问。您必须确保编写该文件的代码将只以只写方式打开该文件,并且您正在读取该文件的脚本绝不能试图写入该文件。否则,您将需要实现另一个解决方案。
现在,您应该能够使用您的第二个脚本来阅读,而不需要您提到的问题。
https://stackoverflow.com/questions/32594137
复制相似问题