在python中将文本文件中的值转换为数组

在python中将文本文件中的值转换为数组,python,string,text-files,data-conversion,Python,String,Text Files,Data Conversion,我有一个文本文件data.txt,看起来是这样的: ADMAS 8.046E+03 8.206E-03 1.532E+04 1.066E-01 6.982E+06-2.820E+00 \n ADMAS -6.868E-03 2.009E+05 1.454E-02 9.516E+05-1.209E+00 6.058E+06 \n ADMAS 1.543E+04 9.179E-01 1.459E+06 5.463E+00 3.918E+07-2.904E+01 \n

我有一个文本文件data.txt,看起来是这样的:

ADMAS      8.046E+03 8.206E-03 1.532E+04 1.066E-01 6.982E+06-2.820E+00 \n
ADMAS     -6.868E-03 2.009E+05 1.454E-02 9.516E+05-1.209E+00 6.058E+06 \n 
ADMAS      1.543E+04 9.179E-01 1.459E+06 5.463E+00 3.918E+07-2.904E+01 \n 
ADMAS     -2.267E-01 9.537E+05 3.902E+00 3.071E+07-1.344E+02 1.073E+08 \n 
ADMAS      7.005E+06 2.260E+01 3.978E+07 6.296E+01 7.586E+09-2.125E+03 \n 
ADMAS      1.093E+00 6.052E+06-6.178E+00 1.065E+08-1.416E+03 1.941E+09 \n 
FAMP       3.824E+03 7.120E-02 1.848E+05 7.317E-01 5.406E+06 4.096E+00 \n 
FEPS       9.039E+01 3.571E+02 2.838E+00 3.580E+02 4.098E+01 1.892E+02 \n 
(以循环模式等)。我只想要ADMAS值,并将它们放入6x6数组中。 我尝试了以下方法:

filename = "data.txt"
string_fnd_1 = "ADMAS"
textfile = open(filename, 'r')
file_lines = textfile.readlines()
textfile.close()
matches_admas = [line for line in file_lines if string_fnd_1 in line]
我得到以下信息:

['ADMAS      8.046E+03 8.206E-03 1.532E+04 1.066E-01 6.982E+06-2.820E+00\n', 'ADMAS     -6.868E-03 2.009E+05 1.454E-02 9.516E+05-1.209E+00 6.058E+06\n',....]

现在,我想去掉字符串“ADMAS”,将值转换为float,并将其重塑为6x6数组。有人知道怎么做吗?我们将不胜感激

这不是最干净的,但似乎有效:

  • 我在减号
    -
    之前创建空格,以便以后在数字之间分割
  • 由于上一点的副作用,我删除了
    E-
    的空格
  • 我删除了用
    替换(\\n“,”)
  • 我也删除了“下一行”字符
    \n
  • 我用
    [11:
输出:

[
    ['8.046E+03', '8.206E-03', '1.532E+04', '1.066E-01', '6.982E+06', '-2.820E+00'],
    ['-6.868E-03', '2.009E+05', '1.454E-02', '9.516E+05', '-1.209E+00', '6.058E+06'],
    ['1.543E+04', '9.179E-01', '1.459E+06', '5.463E+00', '3.918E+07', '-2.904E+01'],
    ['-2.267E-01', '9.537E+05', '3.902E+00', '3.071E+07', '-1.344E+02', '1.073E+08'],
    ['7.005E+06', '2.260E+01', '3.978E+07', '6.296E+01', '7.586E+09', '-2.125E+03'],
    ['1.093E+00', '6.052E+06', '-6.178E+00', '1.065E+08', '-1.416E+03', '1.941E+09']
]

这不是最干净的,但似乎有效:

  • 我在减号
    -
    之前创建空格,以便以后在数字之间分割
  • 由于上一点的副作用,我删除了
    E-
    的空格
  • 我删除了用
    替换(\\n“,”)
  • 我也删除了“下一行”字符
    \n
  • 我用
    [11:
输出:

[
    ['8.046E+03', '8.206E-03', '1.532E+04', '1.066E-01', '6.982E+06', '-2.820E+00'],
    ['-6.868E-03', '2.009E+05', '1.454E-02', '9.516E+05', '-1.209E+00', '6.058E+06'],
    ['1.543E+04', '9.179E-01', '1.459E+06', '5.463E+00', '3.918E+07', '-2.904E+01'],
    ['-2.267E-01', '9.537E+05', '3.902E+00', '3.071E+07', '-1.344E+02', '1.073E+08'],
    ['7.005E+06', '2.260E+01', '3.978E+07', '6.296E+01', '7.586E+09', '-2.125E+03'],
    ['1.093E+00', '6.052E+06', '-6.178E+00', '1.065E+08', '-1.416E+03', '1.941E+09']
]

你应该考虑用熊猫来做这件事。

python -m pip install pandas
然后您需要将熊猫导入到您的代码中

import pandas as pd
然后,您需要找到该文件并将其作为数据帧导入

df = pd.read_fwf(YOURPATH + 'data.txt')
#And try to print its head to see if import was successfull
print(df.head())
最后,您应该在数据帧的第一列上过滤'ADAM'

df.loc[df['column_name'] == ADAM]

你应该考虑用熊猫来做这件事。

python -m pip install pandas
然后您需要将熊猫导入到您的代码中

import pandas as pd
然后,您需要找到该文件并将其作为数据帧导入

df = pd.read_fwf(YOURPATH + 'data.txt')
#And try to print its head to see if import was successfull
print(df.head())
最后,您应该在数据帧的第一列上过滤'ADAM'

df.loc[df['column_name'] == ADAM]

根据您的要求,我提出了以下解决方案:

import re
filename = "data.txt"
string_fnd_1 = "ADMAS"

matrix = [] # 6x6 matrix of dtype float
with open(filename, "r") as f:
    for line in f:
        if string_fnd_1 in line:
            # cleaning the bad chars in line
            line = line.strip()
            line = line.strip(" \\n")
            line = re.sub(r"ADMAS\s*", "", line)
            line = re.sub(r"(-[0-9]+\.)", r" \1", line)

            values = [float(value) for value in line.split()]
            matrix.append(values)
输出将是:

[
[8046.0, 0.008206, 15320.0, 0.1066, 6982000.0, -2.82], 
[-0.006868, 200900.0, 0.01454, 951600.0, -1.209, 6058000.0], 
[15430.0, 0.9179, 1459000.0, 5.463, 39180000.0, -29.04], 
[-0.2267, 953700.0, 3.902, 30710000.0, -134.4, 107300000.0], 
[7005000.0, 22.6, 39780000.0, 62.96, 7586000000.0, -2125.0], 
[1.093, 6052000.0, -6.178, 106500000.0, -1416.0, 1941000000.0]
]

希望它能解决你的问题

根据您的要求,我提出了以下解决方案:

import re
filename = "data.txt"
string_fnd_1 = "ADMAS"

matrix = [] # 6x6 matrix of dtype float
with open(filename, "r") as f:
    for line in f:
        if string_fnd_1 in line:
            # cleaning the bad chars in line
            line = line.strip()
            line = line.strip(" \\n")
            line = re.sub(r"ADMAS\s*", "", line)
            line = re.sub(r"(-[0-9]+\.)", r" \1", line)

            values = [float(value) for value in line.split()]
            matrix.append(values)
输出将是:

[
[8046.0, 0.008206, 15320.0, 0.1066, 6982000.0, -2.82], 
[-0.006868, 200900.0, 0.01454, 951600.0, -1.209, 6058000.0], 
[15430.0, 0.9179, 1459000.0, 5.463, 39180000.0, -29.04], 
[-0.2267, 953700.0, 3.902, 30710000.0, -134.4, 107300000.0], 
[7005000.0, 22.6, 39780000.0, 62.96, 7586000000.0, -2125.0], 
[1.093, 6052000.0, -6.178, 106500000.0, -1416.0, 1941000000.0]
]

希望它能解决你的问题

这里的数组叫什么?一个numpy 2D数组,一个列表列表还是…?你在这里叫数组什么?一个numpy 2D数组,一个列表列表或…?在我的特殊情况下,我不想使用熊猫,因为我的数据是6x6x36。36是指36个文件?在我的情况下,每个频率的系数是6x6,我有36个频率。所有数据都存储在一个文本文件中:一个频率的36个值,然后是其他数据,然后是下一个频率的36个值,等等。在我的特殊情况下,我不想使用熊猫,因为我的数据是6x6x36。36是指36个文件?在我的情况下,每个频率的系数是6x6,我有36个频率。所有数据都存储在一个文本文件中:一个频率36个值,然后是其他数据,然后是下一个频率36个值,等等。谢谢您的回答。我觉得你的解决方案最干净。谢谢你的回答。我觉得你的解决方案最干净。谢谢你的回复。下面的代码对我来说看起来更干净,更容易使用。谢谢你的回复。下面的代码对我来说看起来更干净,更容易使用。