- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对编程和 Python 非常陌生,我正在尝试将 DLPOLY HISTORY 文件转换为 arc 文件。我需要做的是提取晶格向量(单词时间步下的 3x3 数组)、x、y 和 z 坐标(每个元素下方的行上的三个条目)和电荷(行上的第四个条目元素)。
理想情况下,我希望最终能够转换任意大小和帧长度的文件。
DLPOLY HISTORY 文件的两个标题行和前两帧如下所示:
File Title
0 3 5 136 1906
timestep 0 5 0 3 0.000500 0.000000
3.5853000000 0.0000000000 0.0000000000
-1.7926500000 3.1049600000 0.0000000000
0.0000000000 0.0000000000 4.8950000000
Ca 1 40.078000 1.050000 0.000000
0.000000000 0.000000000 0.000000000
O 2 15.999400 -0.950000 0.000000
1.792650000 -1.034986100 1.140535000
H 3 1.007940 0.425000 0.000000
1.792650000 -1.034986100 1.933525000
O 4 15.999400 -0.950000 0.000000
-1.792650000 1.034987000 -1.140535000
H 5 1.007940 0.425000 0.000000
-1.792650000 1.034987000 -1.933525000
timestep 10 5 0 3 0.000500 0.005000
3.5853063513 0.0000000000 0.0000000000
-1.7926531756 3.1049655004 0.0000000000
0.0000000000 0.0000000000 4.8950086714
Ca 1 40.078000 1.050000 0.020485
-0.1758475885E-01 0.1947928245E-04 -0.1192033544E-01
O 2 15.999400 -0.950000 0.051020
1.841369991 -1.037431082 1.120698646
H 3 1.007940 0.425000 0.416965
1.719029690 -1.029327936 2.355541077
O 4 15.999400 -0.950000 0.045979
-1.795057186 1.034993005 -1.093028694
H 5 1.007940 0.425000 0.373772
-1.754959531 1.067269072 -2.320776528
到目前为止我的代码是:
fileList = history_file.readlines()
number_of_frames = int(fileList[1].split()[3])
number_of_lines = int(fileList[1].split()[4])
frame_length = (number_of_lines - 2) / number_of_frames
number_of_atoms = int(fileList[1].split()[2])
lines_per_atom = frame_length / number_of_atoms
for i in range(3, number_of_lines+1, frame_length):
#maths for converting lattice vectors
#print statement to write out converted lattice vectors
for j in range(i+3, frame_length+1, lines_per_atom):
atom_type = fileList[j].split()[0]
atom_x = fileList[j+1].split()[0]
atom_y = fileList[j+1].split()[1]
atom_z = fileList[j+1].split()[2]
charge = fileList[j].split()[3]
print atom_type, atom_x, atom_y, atom_z, charge
我可以提取并转换晶格向量,所以这不是问题。然而,当谈到第二个 for 循环时,它只执行一次,它认为我的范围结束语句
frame_length+1
不正确,但如果我将其更改为
i+3+frame_length+1
我收到以下错误:
charge = fileList[j].split()[3]
IndexError: list index out of range
我认为这意味着我要越过数组的末尾。
我确信我忽略了一些非常简单的事情,但我们将不胜感激。
我还想知道是否有一种更有效的方法来读取文件,因为据我了解,readlines 将整个文件读取到内存中,并且 HISTORY 文件的大小可以轻松达到几 GB。
最佳答案
好的,我们可以使用您提供的示例值进行相当简单的检查来找到问题。如果我们输入以下代码
for i in range(3,1907,136):
for j in range(i+3,137,2):
print i,j
我们得到这个:
3 6
3 8
3 10
...
3 132
3 134
3 136
这是您遇到的错误。循环似乎只迭代一次。但是,如果我们稍微更改一下代码,我们就会看到问题的根源。如果我们运行
for i in range(3,1907,136):
print "i:", i,
for j in range(i+3,137,2):
print "j:", j
我们得到这个:
i: 3 j: 6
j: 8
j: 10
j: 12
...
j: 134
j: 136
i: 139 i: 275 i: 411 i: 547 i: 683 i: 819 i: 955 i: 1091 i: 1227 i: 1363 i: 1499
i: 1635 i: 1771
因此,您可以看到内部循环(j 循环)第一次运行,一旦完成,外部循环(i 循环)就会一直运行,而不会让内部循环继续运行。这是因为您在内循环上设置了 range
的方式。第一次运行时,其计算结果为 range(3,137,2)
,但第二次运行时,结果为 range(142,137,2)
,因为 i
> 第二次运行时从 139 开始。它在开始之前就已经终止了。
为了得到你想要的(或者我认为你想要的),内循环是这样的:
for j in range(4,frame_length,line_per_atom):
atom_type = fileList[j+i].split()[0]
这使得j
成为每帧中第四行之后的行的迭代器
但我还没弄清楚你的代码是如何工作的。我手工计算了你的示例中的值,只是作为检查。
frame_length = (1906 - 2) / 136 = 14
lines_per_atom = 14 / 5 = 2.8
2.8 的 lines_per_atom
是非法的,它必须是一个整数,我不知道你为什么没有得到 TypeError
。 lines_per_atom 的计算应为 lines_per_atom = (frame_length - 4)/number_of_atoms
无论如何,希望这能奏效!
(另外,以后尝试使用驼峰式大小写作为变量名称,而不是下划线。因此 lines_per_atom
变为 linesPerAtom
,在我看来更容易输入)
关于python - For 循环遍历 Python 中文本文件的重复部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299003/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!