【问题标题】:How to read data from a file and set to different variable?如何从文件中读取数据并设置为不同的变量?
【发布时间】:2021-11-22 11:36:56
【问题描述】:

我有一个包含以下数据的文件 (integral.txt)。

    1 H    1   1
   3
    3.4252509100    0.2769343610
    0.6239137300    0.2678388518
    0.1688554000    0.0834736696
    2 H    1   2
   3
    4.4252509100    0.2769343610
    1.6239137300    0.2678388518
    0.1688554000    0.0834736696

我正在编写一个可以读取特定行的代码。例如,我想将第一行读取为 nbasis、label、natom、_ 然后程序读取第二行作为输入,因为我将在 for 循环中使用这个数字,并且每次都可以不同,并且取决于这个数字, 我将读取下一行,所以如果它是三行,程序读取三行并设置一个名为 zeta1, cijk1 的变量,并对接下来的五行执行相同的过程。 我做了如下代码,但我的代码将所有数据作为一个变量读取。

nb = 2 ! This number can be different and here is the simplest case as the data file can be more lines so depend on this number I can read more 
with open("integral.txt","r") as input3:
     for b in range(nb):
         intr = input3.readline()
         nprimitive = int(input3.readline())
         nbasis, label, natom, _ = intr.split()
         for prim in range(nprimitive):
             intr2 = input3.readline()
             zeta , cijk = intr2.split()
             print(zeta,cijk)

Output
3.4252509100  0.2769343610
0.6239137300  0.2678388518
0.1688554000  0.0834736696
4.4252509100  0.2769343610
1.6239137300  0.2678388518
0.1688554000  0.0834736696

The output I want to get
    zeta1           cijk1
    3.4252509100    0.2769343610
    0.6239137300    0.2678388518
    0.1688554000    0.0834736696
    zeta2           cijk2
    4.4252509100    0.2769343610
    1.6239137300    0.2678388518
    0.1688554000    0.0834736696

【问题讨论】:

  • 即使您可以从输入数据中设置变量,您的代码也必须依赖于这些变量名称(您无法预测,因为它们来自您可能获得的任何输入)。这不是很实用。你可能会得到一本字典(比如 {"zeta1" : [3.4252509100, 0.6239137300, 0.1688554000], ...} 或者你可以打印你得到的值(在它们的标题下)。这有意义吗?
  • 问题是我会再次使用它们,我会用zeta1和zeta2做一些计算,比如乘法,所以我需要zeta1有三个值,zeta2有其他三个值
  • 我看到的唯一不同是您的输出没有带有编号的print('zeta\tcijk')
  • @StevenSummers 但我想将每个 zeta 分开,因为我将在输出中使用每个 zeta。我只有一个zeta。我想让 zeta 依赖于“nb”,所以如果 nb 是 2。我会得到 zeta1 和 zeta2。如果是 3 我可以得到 zeta1、zeta2 和 zeta3 等等
  • 从你所拥有的,它不是已经做到了吗?使用nb=2,您将获得前 2 套

标签: python list


【解决方案1】:

IIUC,你只需要读H之前的第一个数字。

您可以为此使用正则表达式:

import re

with open("integral.txt","r") as f:
    out = re.sub(r'[ \t]+(\d+) \w+[^\n]*\n\s+\d+[^\n]*', 
                 r'    zeta\1           cijk\1', f.read())
    print(out)

输出:

    zeta1           cijk1
    3.4252509100    0.2769343610
    0.6239137300    0.2678388518
    0.1688554000    0.0834736696
    zeta2           cijk2
    4.4252509100    0.2769343610
    1.6239137300    0.2678388518
    0.1688554000    0.0834736696

【讨论】:

  • 感谢您的帮助,但这不是我想要的
  • @Zema 你能解释一下为什么吗?最好也提供一个反例
  • 数据在一个文件里面,你直接使用了数据,但是我需要从文件中读取数据。根据您的方法,我可以将 zeta1 与 zeta2 相乘吗?
  • 我明白了,我只是怀疑这部分,因为我认为这很明显。当然,您可以从文件中执行相同的操作。你去的输出是什么?打印还是新文件?
  • 打印输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多