Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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 在if语句中使用多个布尔值来决定写入哪个文件_Python_If Statement_Io_Boolean - Fatal编程技术网

Python 在if语句中使用多个布尔值来决定写入哪个文件

Python 在if语句中使用多个布尔值来决定写入哪个文件,python,if-statement,io,boolean,Python,If Statement,Io,Boolean,我试图捕捉4570颗行星之间的近距离相遇,并将数据输出到特定的文件中,具体取决于哪两颗行星有过近距离相遇。我一共有5颗行星,每颗行星都只与邻近的行星有一次近距离接触,剩下4次接触的可能性 data1 = open('data1.txt', 'a+') data2 = open('data2.txt', 'a+') data3 = open('data3.txt', 'a+') data4 = open('data4.txt', 'a+') for i in range(0,100000): #

我试图捕捉4570颗行星之间的近距离相遇,并将数据输出到特定的文件中,具体取决于哪两颗行星有过近距离相遇。我一共有5颗行星,每颗行星都只与邻近的行星有一次近距离接触,剩下4次接触的可能性

data1 = open('data1.txt', 'a+')
data2 = open('data2.txt', 'a+')
data3 = open('data3.txt', 'a+')
data4 = open('data4.txt', 'a+')

for i in range(0,100000): #range this big since close encounters don't happen every iteration      
    def P_dist(p1, p2):
        #function calculating distances between planets


    init_SMA = [sim.particles[1].a,sim.particles[2].a,sim.particles[3].a,sim.particles[4].a,sim.particles[5].a]

    try:
        sim.integrate(10e+9*2*np.pi)
    except rebound.Encounter as error:
        print(error)

    for j in range(len(init_SMA)-1):
        distance = P_dist(j, j+1)
        if distance <= .01:
            count+=1
            if count > 4570:
                break
            elif(init_SMA[j] == init_SMA[0] and init_SMA[j+1] == init_SMA[1])
                #write stuff to data1
            elif(init_SMA[j] == init_SMA[1] and init_SMA[j+1] == init_SMA[2])
                #write stuff to data2
            elif(init_SMA[j] == init_SMA[2] and init_SMA[j+1] == init_SMA[3])
                #write stuff to data3
            elif(init_SMA[j] == init_SMA[3] and init_SMA[j+1] == init_SMA[4])
                #write stuff to data4

#close files
data1=open('data1.txt','a+'))
data2=open('data2.txt','a+'))
data3=open('data3.txt','a+')
data4=open('data4.txt','a+'))
对于范围内的i(0100000):#范围如此之大,因为亲密接触不会每次迭代都发生
def P_区(p1、p2):
#计算行星间距离的函数
init_SMA=[sim.particles[1]。a,sim.particles[2]。a,sim.particles[3]。a,sim.particles[4]。a,sim.particles[5]。a]
尝试:
模拟集成(10e+9*2*np.pi)
反弹除外。作为错误遇到:
打印(错误)
对于范围内的j(len(初始形状)-1):
距离=P_距离(j,j+1)
如果距离为4570:
打破
elif(init_SMA[j]==init_SMA[0]和init_SMA[j+1]==init_SMA[1])
#将内容写入数据1
elif(init_SMA[j]==init_SMA[1]和init_SMA[j+1]==init_SMA[2])
#将内容写入数据2
elif(init_SMA[j]==init_SMA[2]和init_SMA[j+1]==init_SMA[3])
#将内容写入数据3
elif(init_SMA[j]==init_SMA[3]和init_SMA[j+1]==init_SMA[4])
#将内容写入数据4
#关闭文件

各位,我道歉。我遗漏了很多显示行星系统创建的代码。主for循环负责创建一个行星系统,捕捉一次近距离遭遇,将其写入文件,并重复,直到发生4570次近距离遭遇。

在运行脚本中打开四个不同的文件并不理想。此外,您还没有使用Python的方便的
上下文管理器打开这些文件,它负责干净地关闭打开的文件。在每次循环迭代中,您也要执行开放操作—文件通常应该打开和关闭一次,因为会产生大量间接的I/O开销

至于更简洁的方法,我会有条件地在Python数据存储对象中累积项/行,然后在脚本末尾进行一次性打开和写入。这样,如果在主逻辑期间出现错误,您就没有部分写入的文件

这将是一种大致如下的情况:

create 4 empty lists

for loop
    logic to conditionally append lines to be written to the text files to those lists

with open('data1.txt', 'a+') as f:
    write contents of list1 to f
... copy paste for remaining 3

在一个运行的脚本中打开四个不同的文件并不理想。此外,您还没有使用Python的方便的
上下文管理器打开这些文件,它负责干净地关闭打开的文件。在每次循环迭代中,您也要执行开放操作—文件通常应该打开和关闭一次,因为会产生大量间接的I/O开销

至于更简洁的方法,我会有条件地在Python数据存储对象中累积项/行,然后在脚本末尾进行一次性打开和写入。这样,如果在主逻辑期间出现错误,您就没有部分写入的文件

这将是一种大致如下的情况:

create 4 empty lists

for loop
    logic to conditionally append lines to be written to the text files to those lists

with open('data1.txt', 'a+') as f:
    write contents of list1 to f
... copy paste for remaining 3

我可能会将这四个数据文件放在一个列表中,这样您就可以:

filesArray = [data1,data2,data3,data4]
#insider your for loop:
if(count > 4750):
    break
if(distance <= 0.01):
    count += 1
    filesArray[j].write(data)#for whatever your data is
else:
    break
filesArray=[data1、data2、data3、data4]
#你的圈内人:
如果(计数>4750):
打破
如果(距离4750):
打破

如果(距离我可能会将四个数据文件放在一个列表中,这样您就可以:

filesArray = [data1,data2,data3,data4]
#insider your for loop:
if(count > 4750):
    break
if(distance <= 0.01):
    count += 1
    filesArray[j].write(data)#for whatever your data is
else:
    break
filesArray=[data1、data2、data3、data4]
#你的圈内人:
如果(计数>4750):
打破
如果(距离4750):
打破

如果(距离)看起来像是SMA和SMA的混合(它们不同吗?),则计算距离j到j+1,但这并不涵盖所有情况(您有5 x 4个案例=20,而不仅仅是4个)如果计数大于4570,为什么要中断循环?该循环只有四个5iterations@MrE,在我的例子中,近距离接触只发生在相邻的行星之间。只有4种情况是可能的。但是,捕捉sma/sma的东西+1。@djk47463对你所问的有点困惑,似乎你混合了sma和sma(它们不同吗?)然后,计算距离j到j+1,但这并不包括所有情况(5 x 4个情况=20,而不仅仅是4个)如果计数大于4570,为什么要中断循环?该循环只有四个5iterations@MrE,在我的例子中,近距离接触只发生在相邻的行星之间。只有4种情况是可能的。但是,捕捉sma/sma事件时+1。@djk47463对您要问的内容有点困惑这将为每次写入打开/关闭文件——对于4750来说非常慢操作。我只是想对上面的内容进行评论。这段代码也不理想。我不想假设提问者有大量的ram,我也不知道每个“数据”的大小他们正在写的块-每个星球可以代表几兆字节的数据,然后你将其中4750个保存到一组列表中?你将使用快速交换内存,然后它的速度很慢这将为每次写入打开/关闭文件-对于4750个操作非常慢。我只是想对上面的代码进行注释。这段代码也不理想。我做了我不想假设提问者有大量的内存,我也不知道他们写的每个“数据”块的大小——每个星球可以代表几兆字节的数据,然后你把4750个数据保存到一组列表中?你将使用交换内存的速度很快,但无论如何都很慢