【问题标题】:Unable to print the updated values for a modified object in python无法在 python 中打印已修改对象的更新值
【发布时间】:2016-06-26 02:02:31
【问题描述】:

我正在尝试修改结构对象中的字段。基本上,我正在尝试将某些原子的值从 [True, True, True] 设置为 [False,False,False]。这些在文件中的原子旁边显示为 T T T。这是我尝试过的:

import pymatgen.io.vaspio as iopy
import numpy as np
import json

np.zdiff=[]  # to store the z coordinates of atoms

struc = iopy.Poscar.from_file("POSCAR") # read the structure file

for i in range(len(struc.structure)):
        np.zdiff.append(struc.structure[i].z) 

unique=set(np.zdiff)
newzdiff=list(unique)
zval=sorted(newzdiff)  # z coordinated sorted

for i in xrange(len(struc.structure)):
        if struc.structure[i].z <= float(zval[1]): # if z is <= a value
                #np.reg1.append(struc[i].z)
                struc.structure[i].selective_dynamics=[True,True,True]

        elif struc.structure[i].z <= float(zval[3]): # second condition
                #np.reg2.append(struc[i].z)
                struc.structure[i].selective_dynamics=[False,False,False]
        struc.write_file("POSCAR.2") # write the file here

[True True True] 值在 POSCAR.2 中保持不变。但是,当我以交互方式运行上述代码时:

struc.structure[21].selective_dynamics 给出 [False, False, False] 而它最初是 [True, True, True]

也就是说,已经按照程序进行了修改。为什么它不打印在文件中?

这是我正在阅读的原始文件:

  0.0000000000000000  0.2500000000000000  0.2500000000000000  T T T
  0.2500000000000000  0.0000000000000000  0.2500000000000000  T T T
  0.2500000000000000  0.2500000000000000  0.0000000000000000  T T T
  0.5000000000000000  0.2500000000000000  0.2500000000000000  T T T
  0.7500000000000000  0.0000000000000000  0.2500000000000000  T T T
  0.7500000000000000  0.2500000000000000  0.0000000000000000  T T T
  0.0000000000000000  0.7500000000000000  0.2500000000000000  T T T
  0.2500000000000000  0.5000000000000000  0.2500000000000000  T T T
  0.2500000000000000  0.7500000000000000  0.0000000000000000  T T T
  0.5000000000000000  0.7500000000000000  0.2500000000000000  T T T
  0.7500000000000000  0.5000000000000000  0.2500000000000000  T T T
  0.7500000000000000  0.7500000000000000  0.0000000000000000  T T T
  0.0000000000000000  0.2500000000000000  0.7500000000000000  T T T
  0.2500000000000000  0.0000000000000000  0.7500000000000000  T T T
  0.2500000000000000  0.2500000000000000  0.5000000000000000  T T T
  0.5000000000000000  0.2500000000000000  0.7500000000000000  T T T
  0.7500000000000000  0.0000000000000000  0.7500000000000000  T T T
  0.7500000000000000  0.2500000000000000  0.5000000000000000  T T T
  0.0000000000000000  0.7500000000000000  0.7500000000000000  T T T
  0.2500000000000000  0.5000000000000000  0.7500000000000000  T T T
  0.2500000000000000  0.7500000000000000  0.5000000000000000  T T T
  0.5000000000000000  0.7500000000000000  0.7500000000000000  T T T
  0.7500000000000000  0.5000000000000000  0.7500000000000000  T T T
  0.7500000000000000  0.7500000000000000  0.5000000000000000  T T T
  0.0000000000000000  0.0000000000000000  0.0000000000000000  T T T
  0.0000000000000000  0.5000000000000000  0.0000000000000000  T T T
  0.5000000000000000  0.0000000000000000  0.0000000000000000  T T T
  0.5000000000000000  0.5000000000000000  0.0000000000000000  T T T
  0.0000000000000000  0.0000000000000000  0.5000000000000000  T T T
  0.0000000000000000  0.5000000000000000  0.5000000000000000  T T T
  0.5000000000000000  0.0000000000000000  0.5000000000000000  T T T
  0.5000000000000000  0.5000000000000000  0.5000000000000000  T T T

这是我得到的文件:(T 代表 True,F 代表 False,我正在尝试针对某些原子进行修改,不要介意符号 Ni 和 Al,它们仅供参考)

0.000000 0.250000 0.250000 T T T Ni
0.250000 0.000000 0.250000 T T T Ni
0.250000 0.250000 0.000000 T T T Ni
0.500000 0.250000 0.250000 T T T Ni
0.750000 0.000000 0.250000 T T T Ni
0.750000 0.250000 0.000000 T T T Ni
0.000000 0.750000 0.250000 T T T Ni
0.250000 0.500000 0.250000 T T T Ni
0.250000 0.750000 0.000000 T T T Ni
0.500000 0.750000 0.250000 T T T Ni
0.750000 0.500000 0.250000 T T T Ni
0.750000 0.750000 0.000000 T T T Ni
0.000000 0.250000 0.750000 T T T Ni
0.250000 0.000000 0.750000 T T T Ni
0.250000 0.250000 0.500000 T T T Ni
0.500000 0.250000 0.750000 T T T Ni
0.750000 0.000000 0.750000 T T T Ni
0.750000 0.250000 0.500000 T T T Ni
0.000000 0.750000 0.750000 T T T Ni
0.250000 0.500000 0.750000 T T T Ni
0.250000 0.750000 0.500000 T T T Ni
0.500000 0.750000 0.750000 T T T Ni
0.750000 0.500000 0.750000 T T T Ni
0.750000 0.750000 0.500000 T T T Ni
0.000000 0.000000 0.000000 T T T Al
0.000000 0.500000 0.000000 T T T Al
0.500000 0.000000 0.000000 T T T Al
0.500000 0.500000 0.000000 T T T Al
0.000000 0.000000 0.500000 T T T Al
0.000000 0.500000 0.500000 T T T Al
0.500000 0.000000 0.500000 T T T Al
0.500000 0.500000 0.500000 T T T Al

【问题讨论】:

    标签: python loops struct scope


    【解决方案1】:

    您从 for 循环内部调用 write_file 函数很可疑。这会导致整个文件被写入 n 次,并且每次都不会相同,因为您在通过循环索引时正在修改 struc。尝试将该语句移到循环之外,看看你得到了什么。

    不清楚您是说“交互式”与“非交互式”运行程序的行为是否不同,无论这可能意味着什么。你应该澄清这一点。

    【讨论】:

    • 我应该澄清一下。我尝试在循环外使用 write_file 函数,但仍然没有帮助。这就是我把它放在里面的原因,但它给出了相同的输出,即使它被覆盖了多次。通过交互式,我的意思是您以交互方式运行程序(python -i 程序),因此您拥有活动控制台。在这种情况下,我看到字段已被修改。我希望这能说明问题,我很抱歉我之前没有详细说明。
    • 如果你说的是真的,那么程序并没有将数据的最终值写入文件。 write_file 函数是否正确打开和关闭文件?将struct 的值作为程序的最后一行打印到控制台怎么样(您可能需要一个循环来一次打印一行)?如果有正确的值,那么问题一定出在 write_file 中。
    • 你是对的。我可以在循环之外单独打印新字段。它只是摆脱一些标点符号并添加新标题的额外工作。我希望我可以解决 write_file 的问题,因为这个内置函数没有关闭对象。所以我无法关闭为一般 python 文件操作完成的文件。感谢您的帮助!
    猜你喜欢
    • 2017-11-03
    • 2019-04-15
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多