首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要从python3中的文本文件中提取表格数据

需要从python3中的文本文件中提取表格数据
EN

Stack Overflow用户
提问于 2019-01-17 02:30:50
回答 3查看 538关注 0票数 1

我有一个量子化学程序的输出,我希望从中提取表格数据,以便输入到我大约25年前编写的FORTRAN程序的Python端口中。

有些输出文件相当长,多达6000行,这就排除了使用电子表格进行处理的可能性。

典型的表格形式如下:

代码语言:javascript
复制
                             CARTESIAN COORDINATES

   1    C        0.011987266    -0.003842185     0.006578784
   2    H        1.097152909    -0.003956163     0.013339310
   3    H       -0.349612312     1.019316731     0.001903075
   4    H       -0.344276148    -0.517463019    -0.880495291
   5    H       -0.355315644    -0.513266496     0.891567896

我并不是要求有人为我编写Python代码,而是在迷宫般的可用代码中给我一些指导。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-17 03:02:12

我建议你调查一下np.genfromtxt。下面的代码片段将从存储在名为data.txt的文件中的问题中读取示例数据。

代码语言:javascript
复制
import numpy as np
data = np.genfromtxt('data.txt', skip_header=2, dtype=[('id', 'i8'),('label','S1'),('x','f8'),('y','f8'),('z','f8')])
print(data)

输出

代码语言:javascript
复制
 [(1, b'C',  0.01198727, -0.00384219,  0.00657878)
 (2, b'H',  1.09715291, -0.00395616,  0.01333931)
 (3, b'H', -0.34961231,  1.01931673,  0.00190307)
 (4, b'H', -0.34427615, -0.51746302, -0.88049529)
 (5, b'H', -0.35531564, -0.5132665 ,  0.8915679 )]
票数 0
EN

Stack Overflow用户

发布于 2019-01-17 04:49:41

我会使用readline和split。

代码语言:javascript
复制
cc = 'CARTESIAN_COORDINATES.txt'

with open(cc) as data:
    lines = data.readlines()[2:] # skip first two lines
    for line in lines:
        ls = line.split()
        a, b, c, d, e = int(ls[0]), ls[1], float(ls[2]), float(ls[3]), float(ls[4])
        print(a, b, c, d, e)

输出:

代码语言:javascript
复制
1 C 0.011987266 -0.003842185 0.006578784
2 H 1.097152909 -0.003956163 0.01333931
3 H -0.349612312 1.019316731 0.001903075
4 H -0.344276148 -0.517463019 -0.880495291
5 H -0.355315644 -0.513266496 0.891567896
票数 1
EN

Stack Overflow用户

发布于 2019-01-17 03:13:08

正则表达式是为从数据中提取数据而构建-如果您的表总是定义良好,则可以使用f.e.:https://regex101.com/r/QUT2o3/2提取它们

代码语言:javascript
复制
import re

regex = r"(\d+ +\w+ (?: +-?\d+\.\d+){3}.+?(?:\n|\Z){2})+"

test_str = ("                      CARTESIAN COORDINATES\n\n"
    "   1    C        0.011987266    -0.003842185     0.006578784\n"
    "   2    H        1.097152909    -0.003956163     0.013339310\n"
    "   3    H       -0.349612312     1.019316731     0.001903075\n"
    "   4    H       -0.344276148    -0.517463019    -0.880495291\n"
    "   5    H       -0.355315644    -0.513266496     0.891567896\n\n\n\n"
    "                      CARTESIAN COORDINATES\n\n"
    "   1    C        0.011987266    -0.003842185     0.006578784\n"
    "   2    H        1.097152909    -0.003956163     0.013339310\n"
    "   3    H       -0.349612312     1.019316731     0.001903075\n"
    "   4    H       -0.344276148    -0.517463019    -0.880495291\n"
    "   5    H       -0.355315644    -0.513266496     0.891567896\n\n\n"
    "                      CARTESIAN COORDINATES\n\n"
    "   1    C        0.011987266    -0.003842185     0.006578784\n"
    "   2    H        1.097152909    -0.003956163     0.013339310\n"
    "   3    H       -0.349612312     1.019316731     0.001903075\n"
    "   4    H       -0.344276148    -0.517463019    -0.880495291\n"
    "   5    H       -0.355315644    -0.513266496     0.891567896")

应用正则表达式:

代码语言:javascript
复制
matches = re.findall(regex, test_str, re.MULTILINE | re.DOTALL)
for m in matches:
    print('\n'.join(x.strip() for x in m.splitlines()))

输出:

代码语言:javascript
复制
1    C        0.011987266    -0.003842185     0.006578784
2    H        1.097152909    -0.003956163     0.013339310
3    H       -0.349612312     1.019316731     0.001903075
4    H       -0.344276148    -0.517463019    -0.880495291
5    H       -0.355315644    -0.513266496     0.891567896

1    C        0.011987266    -0.003842185     0.006578784
2    H        1.097152909    -0.003956163     0.013339310
3    H       -0.349612312     1.019316731     0.001903075
4    H       -0.344276148    -0.517463019    -0.880495291
5    H       -0.355315644    -0.513266496     0.891567896

1    C        0.011987266    -0.003842185     0.006578784
2    H        1.097152909    -0.003956163     0.013339310
3    H       -0.349612312     1.019316731     0.001903075
4    H       -0.344276148    -0.517463019    -0.880495291
5    H       -0.355315644    -0.513266496     0.891567896
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54223238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档