将上述代码改进一下,要求能识别出每个POSCAR中的化学元素C原子,避免出现找不到C原子的情况
时间: 2024-03-20 22:38:34 浏览: 109
好的,您可以尝试以下代码:
```python
import os
from ase.io import read
import numpy as np
import csv
# 获取当前目录下所有POSCAR文件
file_list = [f for f in os.listdir('.') if f.endswith('.vasp') or f.endswith('.POSCAR')]
# 创建CSV文件并写入表头
with open('C_atom_positions.csv', mode='w', newline='') as csv_file:
fieldnames = ['POSCAR', 'Avg_X', 'Avg_Y', 'Avg_Z', 'Range_X', 'Range_Y', 'Range_Z']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for file_name in file_list:
# 读取POSCAR文件
structure = read(file_name)
# 获取晶格常数和C原子坐标
lattice = structure.get_cell()
c_atoms = [atom for atom in structure if atom.symbol == 'C']
if len(c_atoms) == 0:
print(f"No 'C' atom found in {file_name}")
continue
c_coords = np.array([atom.position for atom in c_atoms])
# 计算C原子的平均位置和平均分布范围
avg_position = np.mean(c_coords, axis=0)
avg_range = np.amax(c_coords, axis=0) - np.amin(c_coords, axis=0)
# 将结果写入CSV文件
writer.writerow({'POSCAR': file_name, 'Avg_X': avg_position[0], 'Avg_Y': avg_position[1],
'Avg_Z': avg_position[2], 'Range_X': avg_range[0], 'Range_Y': avg_range[1],
'Range_Z': avg_range[2]})
```
这段代码会读取当前目录下所有的POSCAR文件,计算每个POSCAR晶胞中C原子的平均位置和平均分布范围,并将结果输出到名为`C_atom_positions.csv`的CSV文件中。在这个代码中,我们首先使用ASE库的`read`函数来读取POSCAR文件,并用`get_cell`和`get_positions`函数获取晶格常数和原子坐标。然后,我们使用列表推导式和条件语句来获取化学元素为C的原子,并避免了找不到C原子的情况。最后,我们使用Python内置的`csv`库来写入CSV文件,并在CSV文件中添加了表头。
阅读全文