Python:如何从文本文件中提取字符串以用作数据

时间:2012-07-27 15:27:02

标签: python

这是我第一次编写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。我必须记住,我需要将这些数字乘以原子的类型,所以我需要一种方法来为每种原子类型定义它们。任何人都可以把我推向正确的方向吗?

3 个答案:

答案 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表格数据结构)。它会在导入时为您保存代码行,如果您想进行任何其他数据操作,还可以为您提供大量数据修改功能。