每次出现字符串时都要读取文件并创建一个数组

时间:2018-01-09 23:16:03

标签: python

我想读取一个包含字符串的文件,比如标题,然后是一个数组。我想为每个块生成一个python数组并将它们保存在一个不同的文件中,如下面的LI 1将是一个4 x 4的数组。

LI 1
10. 20. 30. 40.
10. 21. 30. 40.
10. 22. 31. 43.
10. 23. 35. 45.

LI 2
11. 20. 40. 50.
11.2 22. 42. 52.

LI 3
15. 23. 40. 50.
15. 24. 41. 51.
15.2 25. 42. 52.

LI 10
10.3 26. 30. 40.
10.2 27. 30. 40.
10.3 28. 31. 43.

LI 3
15. 23. 40. 50.
15. 24. 41. 51.
15.2 25. 42. 52.

我知道如何输入字符串“LI 1”,“LI 2”....但是当LI(数字)重复时也会出现问题,例如下面例子中的“LI 3”,因为我想让他们在不同的档案中。对于下面的文件,我想有5个不同的输出。什么应该是正确的方法?我做的那一刻,例如'LI 2':

with open(file) as infile:
    for line in infile:
        if 'LI 2' in line:
            found_type = True
            continue
        if found_type:
            if 'LI' in line: 
                found_type = False #stops when reach the next LI
            else:
                x.append(line[2:15])
                y.append(line[16:29])
                d1.append(line[31:43])
                d2.append(line[45:57])

xf=filter(None,x)
yf=filter(None,y)           
d1f=filter(None,d1)
d2f=filter(None,d2)

out=np.array([xf,yf,d1f,d2f])        
out=out.T.astype(np.float)

np.savetxt('LI_2.dat',out,delimiter=' ',fmt='%1.8f')

1 个答案:

答案 0 :(得分:0)

这样的事情可能有用。读取行然后进行数字转换。从您的代码中,我不确定您是否要为每个块或所有块组合进行单独的过滤和文件。所以我假设了前者。希望这有帮助!

import string
import random

lines = ''
output_folder ='folder/'
with open(file) as infile:
    lines = infile.readlines()

for line in lines:
    if 'LI' in line:
        x=[]
        y=[]
        d1=[]
        d2=[]
        output = output_folder + line.strip()+ random.choice(string.letters) + '.dat'
    elif line =='\n':
        pass
    else:
        numbers = line.split()
        x.append(float(numbers[0]))
        y.append(float(numbers[1]))
        d1.append(float(numbers[2]))
        d2.append(float(numbers[3]))
        xf=filter(None,x)
        yf=filter(None,y)           
        d1f=filter(None,d1)
        d2f=filter(None,d2)
        out=np.array([xf,yf,d1f,d2f])        
        out=out.T.astype(np.float)
        np.savetxt(output,out,delimiter=' ',fmt='%1.8f')