当前位置: 首页 > 知识库问答 >
问题:

Python:如何从文本文件中拆分位置数据

钱照
2023-03-14

我有一个文本文件,其中包含我试图用Python读取的数据:

OMEGA2    1.450E+00 1.500E+00 1.550E+00 1.600E+00 1.650E+00 1.700E+00
OMEGA2    1.800E+00 1.850E+00 1.900E+00 1.950E+00 2.000E+00 2.050E+00
F2REAL    1.146E+00 -1.015E+03-2.206E+03-2.618E+03-2.288E+03-1.400E+03
F2REAL    6.255E+00 -3.254E+02-8.150E+02-1.060E+03-9.749E+02-5.995E+02
F2REAL    1.754E+01 -1.530E+02-4.375E+02-5.932E+02-5.618E+02-3.536E+02
F2REAL    1.740E+01 -7.981E+01-2.525E+02-3.748E+02-3.891E+02-2.739E+02
OMEGA2    1.800E+00 1.850E+00 1.900E+00 1.950E+00 2.000E+00 2.050E+00

现在,我只想得到以F2REAL开头的值;每行,我要提取6个值。值1从索引11到索引20,值到从索引21到30。。。,值6来自索引61:70

我尝试了以下方法:

file = 'file.txt'
STR1 = 'F2REAL'

def get_data():
    with open(file) as f:
        hyd_all = f.readlines()
        for line in hyd_all:
            if STR1 in line:
                print([float(line[10:19]),float(line[20:29])])

get_data()
  1. 这不会读取电子功率,因为我得到了[1.146,-1.015,...]。我如何正确地得到它?
  2. 有没有更好的方法而不是写10:19,20:29,..60:69?所有感兴趣的行都有6列并且总是从10*i开始
  3. 我想将每个结果附加到一个矩阵中。在这个4行6列的示例中

共有3个答案

寿伟
2023-03-14
def parse_scientific(s):
    root = float(s.split('E')[0])
    exp  = int(s.split('E')[1])
    return root*(10**exp)

def get_data():
    with open(file) as f:
        hyd_all = f.readlines()
        for line in hyd_all:
            if line.startswith(STR1):
                item_values = [parse_scientific(line[offset*10:offset*10+10]) for offset in range(1,7)]

使用item_values插入矩阵

安建木
2023-03-14
file = 'file.txt'
STR1 = 'F2REAL'

def get_data():
    with open(file) as f:
        hyd_all = f.readlines()
        for line in hyd_all:
            if STR1 in line:
                print(line[10:20],line[20:30],line[30:40],line[40:50],line[50:60],line[60:70])

get_data()

结果如下:

弓胜泫
2023-03-14

>

你可以用列表理解

假设您正在谈论一个numpy矩阵(否则只需切换到pandas数据帧):

import numpy as np


def get_data(path: str, target: str, width: int = 10):
    values = []
    with open(path, 'r') as f:
        for line in f.readlines():
            # 'F2REAL' should be at the beginning of the line not just anywhere
            if line.startswith(target):
                # map sequential fixed widths to float
                values.append([float(line[width*i:width*(i+1)]) for i in range(1, 7)])

    return np.asarray(values)
    

print(get_data('file.txt', 'F2REAL'))

输出:

[[ 1.146e+00 -1.015e+03 -2.206e+03 -2.618e+03 -2.288e+03 -1.400e+03]
 [ 6.255e+00 -3.254e+02 -8.150e+02 -1.060e+03 -9.749e+02 -5.995e+02]
 [ 1.754e+01 -1.530e+02 -4.375e+02 -5.932e+02 -5.618e+02 -3.536e+02]
 [ 1.740e+01 -7.981e+01 -2.525e+02 -3.748e+02 -3.891e+02 -2.739e+02]]
 类似资料:
  • 这个问题似乎不是关于特定的编程问题、软件算法或主要由程序员使用的软件工具。如果您认为该问题将在另一个Stack Exchange站点上讨论,您可以留下评论,解释该问题可以在何处回答。 未解决原始关闭原因 我有一个大小为2.5 GB的日志文件。有没有办法使用windows命令提示符将此文件拆分为更小的文件?

  • 我正在尝试用Python以编程方式拆分wav文件。基于stackoverflow的提示以及Python wave模块的文档,我将执行以下操作 我迭代了许多不同的起始值和结束值,并以这种方式从原始文件中提取音频块。奇怪的是,这种技术对某些块非常有效,而对其他块产生垃圾白噪声。此外,没有明显的模式表明起始位置和结束位置会产生白噪声,只是输入文件会持续产生白噪声。 有人以前经历过这种行为吗?或者知道我做

  • 问题内容: 给定捆绑中文件的名称,我想将该文件加载到我的Swift应用程序中。所以我需要使用这种方法: 无论出于何种原因,该方法都需要将文件名与文件扩展名分开。很好,在大多数语言中将两者分开很容易。但是到目前为止,在Swift中我还没有发现。 所以这是我所拥有的: 如果我在第一行中不包含键入内容,则在随后的两行中都会出现错误。有了它,我在第一行得到一个错误: 如何从扩展名中拆分文件名?有一些优雅的

  • 问题内容: 我得到一个包含以下内容的文本文件(12 MB): 有什么办法来分流到12个* .txt文件让说,,(......)? 问题答案: 您可以使用linux bash核心实用程序 注意,或两者都OK,但大小不同。MB为1000 * 1000,M为1024 ^ 2 如果要按行分隔,可以使用参数。 更新 Kirill建议的另一种解决方案,您可以执行以下操作 请注意,是不是,有几个选项,比如,,,

  • 我的Android应用程序中有以下字符串:

  • 问题内容: 我有一些带有时间信息的文本文件,例如: 现在,我需要文件的第三列来计算平均值。 我怎样才能做到这一点?我需要获取所有文本行,然后获取最后一列? 问题答案: 您可以阅读通过线使用的文件中的行或,甚至一些其他techinique。使用扫描仪非常简单,如下所示: 要使用定义的分隔符分割字符串,可以使用split方法,该方法将正则表达式作为参数,并按与该表达式匹配的所有字符序列分割字符串。就您