这是我第一次编写python脚本而且开始时遇到了一些麻烦。假设我有一个名为Test.txt的txt文件,其中包含此信息。
x y z Type of atom
ATOM 1 C1 GLN D 10 26.395 3.904 4.923 C
ATOM 2 O1 GLN D 10 26.431 2.638 5.002 O
ATOM 3 O2 GLN D 10 26.085 4.471 3.796 O
ATOM 4 C2 GLN D 10 26.642 4.743 6.148 C
我想要做的是最终编写一个脚本,找到这三个原子的质心。所以基本上我想总结那个txt文件中的所有x值,每个数字乘以一个给定的值,具体取决于原子的类型。
我知道我需要为每个x值定义位置,但是我无法弄清楚如何将这些x值表示为数字而不是字符串中的txt。我必须记住,我需要将这些数字乘以原子的类型,所以我需要一种方法来为每种原子类型定义它们。任何人都可以把我推向正确的方向吗?
答案 0 :(得分:1)
mass_dictionary = {'C':12.0107,
'O':15.999
#Others...?
}
# If your files are this structured, you can just
# hardcode some column assumptions.
coords_idxs = [6,7,8]
type_idx = 9
# Open file, get lines, close file.
# Probably prudent to add try-except here for bad file names.
f_open = open("Test.txt",'r')
lines = f_open.readlines()
f_open.close()
# Initialize an array to hold needed intermediate data.
output_coms = []; total_mass = 0.0;
# Loop through the lines of the file.
for line in lines:
# Split the line on white space.
line_stuff = line.split()
# If the line is empty or fails to start with 'ATOM', skip it.
if (not line_stuff) or (not line_stuff[0]=='ATOM'):
pass
# Otherwise, append the mass-weighted coordinates to a list and increment total mass.
else:
output_coms.append([mass_dictionary[line_stuff[type_idx]]*float(line_stuff[i]) for i in coords_idxs])
total_mass = total_mass + mass_dictionary[line_stuff[type_idx]]
# After getting all the data, finish off the averages.
avg_x, avg_y, avg_z = tuple(map( lambda x: (1.0/total_mass)*sum(x), [[elem[i] for elem in output_coms] for i in [0,1,2]]))
# A lot of this will be better with NumPy arrays if you'll be using this often or on
# larger files. Python Pandas might be an even better option if you want to just
# store the file data and play with it in Python.
答案 1 :(得分:0)
基本上在python中使用open函数可以打开任何文件。所以你可以做如下的事情:---以下片段不是整个问题的解决方案,而是一种方法。
def read_file():
f = open("filename", 'r')
for line in f:
line_list = line.split()
....
....
f.close()
从这一点开始,您可以很好地设置可以对这些值执行的操作。基本上第二行只是打开文件进行阅读。第三行定义了一个for循环,它一次读取一行文件,每行进入line
变量。
该片段中的最后一行基本上将字符串 - 每个whitepsace - 分解为一个列表。所以line_list [0]将是第一列的值,依此类推。从这一点来说,如果您有任何编程经验,您可以使用if语句等来获得您想要的逻辑。
**另外请记住,存储在该列表中的值的类型都将是字符串,因此如果要执行任何算术运算(例如添加),则必须小心。
* 编辑语法更正
答案 2 :(得分:0)
如果安装了pandas
,请检查导入固定宽度文件的read_fwf
函数并创建DataFrame(2-d表格数据结构)。它会在导入时为您保存代码行,如果您想进行任何其他数据操作,还可以为您提供大量数据修改功能。