我试图拆分格式为的文件:
@some
@garbage
@lines
@target G0.S0
@type xy
-0.108847E+02 0.489034E-04
-0.108711E+02 0.491023E-04
-0.108574E+02 0.493062E-04
-0.108438E+02 0.495075E-04
-0.108302E+02 0.497094E-04
....Unknown line numbers...
&
@target G0.S1
@type xy
-0.108847E+02 0.315559E-04
-0.108711E+02 0.316844E-04
-0.108574E+02 0.318134E-04
....Unknown line numbers...
&
@target G1.S0
@type xy
-0.108847E+02 0.350450E-04
-0.108711E+02 0.351669E-04
-0.108574E+02 0.352908E-04
&
@target G1.S1
@type xy
-0.108847E+02 0.216396E-04
-0.108711E+02 0.217122E-04
-0.108574E+02 0.217843E-04
-0.108438E+02 0.218622E-04
@target Gx.Sy
组合是唯一的,每组数据始终由 &
定位 .
我已设法将文件拆分为块:
#!/usr/bin/env python3
import os
import sys
import itertools as it
import numpy as np
import matplotlib.pyplot as plt
try:
filename = sys.argv[1]
print(filename)
except IndexError:
print("ERROR: Required filename not provided")
with open(filename, "r") as f:
for line in f:
if line.startswith("@target"):
print(line.split()[-1].split("."))
x=[];y=[]
with open(filename, "r") as f:
for key,group in it.groupby(f,lambda line: line.startswith('@target')):
print(key)
if not key:
group = list(group)
group.pop(0)
# group.pop(-1)
print(group)
for i in range(len(group)):
x.append(group[i].split()[0])
y.append(group[i].split()[1])
nx=np.array(x)
ny=np.array(y)
我有两个问题:
1)真实数据之前的前导码行也被分组,因此如果有任何前导码,则脚本不起作用 . 无法预测将会有多少行;但我正试图将 after 和 @target
分组
2)我想将数组命名为G0 [S0,S0]和G1 [S1,S2];但我不能这样做 .
请帮助
UPDATE :我试图将这些数据存储在G0 [S0,S1,...],G1 [S0,S1,..]的嵌套np数组中,以便我可以在matplotlib中使用它 .
3 回答
以下功能完成工作:
要将文件拆分为块,只需运行以下代码:
逐步演示
chunks
是一个字典,其中键是G
(0
或1
):字典
chunks
的值是另一个字典,其中键是S
(在此示例中为0
,1
或2
),该值是包含Gi.Sn
的数字数据的NumPy数组 . 您可以访问此块数据,如下所示:chunks[i][n]
,其中indicesi
和n
分别是G
和S
的值 .对于任何
i
和n
,chunks[i][n].shape[0]
是2
,但是chunks[i][n].shape[1]
可以取任何值,即数字数据的行数可以从一个块到另一个块变化 .formatted_file.txt
这是我在示例运行中使用的文件 . 它由六个块组成,即
G0.S0
,G0.S1
,G0.S2
,G1.S0
,G1.S1
和G1.S2
.这是一种使用生成器和
np.genfromtxt
的方法 . 优点:记忆力强 . 它可以即时过滤文件,因此不需要将整个内容加载到内存中进行处理 .UPDATE:
我简化了代码并将输出格式更改为数组数组 . 例如
G
范围介于0...3
和S
之间的范围0...5
之后,它会创建一个包含数组的4x6数组 .编辑 - 我采取了我的列表方法的反馈,并决定将其切换为词典 . 该解决方案具有对存储器消耗和完全动态的轻微的优点(即,不依赖于先验地知道G块的数量 .
我已经使用了
re
包,这类似于numpy
通过loadtxt()
处理I / O的方式 . 此外,由于真的no point创建了一个嵌套的numpy数组numpy数组,我只是返回一个嵌套的内置list
numpy数组 . 由于您的数据是不均匀的,因此这种方法同样有效(并且更简单):只需将正确的G,S坐标传递给返回的
chunk_arr
即可进行访问 .