Python按字符串重新排序dat文件中的行

时间:2016-07-21 11:20:56

标签: python file file.readalllines

很抱歉,如果这是重复但我暂时找不到它。

基本上我打开并阅读dat文件,其中包含我需要循环获取某些信息的大量路径。

base.dat文件中的每一行都包含m.somenumber。例如,文件中的某些行可能是:

Volumes/hard_disc/u14_cut//u14m12.40_all.beta/beta8
Volumes/hard_disc/u14_cut/u14m12.50_all.beta/beta8
Volumes/hard_disc/u14_cut/u14m11.40_all.beta/beta8

我需要能够重新编写dat文件,以便从最大m.number到最小m.number 重新排序所有行。然后当我在数据库中循环PATH(在代码中显示)时,我正在逐渐减少m。

以下是代码的相关部分

base = open('base8.dat', 'r')
database= base.read().splitlines()
base.close()
counter=0
mu_list=np.array([])
delta_list=np.array([])
ofsset = 0.00136
beta=0


for PATH in database:
    if os.path.exists(str(PATH)+'/CHI/optimal_spectral_function_CHI.dat'):    

        n1_array = numpy.loadtxt(str(PATH)+'/AVERAGES/av-err.n.dat')
        n7_array= numpy.loadtxt(str(PATH)+'/AVERAGES/av-err.npx.dat')
        n1_mean = n1_array[0]
        delta=round(float(5.0+ofsset-(n1_array[0]*2.+4.*n7_array[0])),6)

        par = open(str(PATH)+"/params10", "r")

        for line in par:
            counter= counter+1
            if re.match("mu", line):
                mioMU= re.findall('\d+', line.translate(None, ';'))
                mioMU2=line.split()[2][:-1]
                mu=mioMU2
                print mu, delta, PATH

                mu_list=np.append(mu_list, mu)
                delta_list=np.append(delta_list,delta)

        optimal_counter=0

print delta_list, mu_list

我已经检查了可能的标记重复,但我似乎无法让它为我的工作,因为我的文件在技术上不包含字符串和数字。我需要排序的'数字'包含在整个字符串中:

Volumes/data_disc/u14_cut/from_met/u14m11.40_all.beta/beta16

我需要通过m(somenumber)部分对整行进行排序

1 个答案:

答案 0 :(得分:0)

假设你的行的数字部分具有float的形式,你可以使用正则表达式匹配该部分并将其从string转换为float。

之后,您可以使用此信息对从文件中读取的所有行进行排序。我添加了一个无效行,以显示如何处理无效数据。

作为一个简单的例子,我会建议这样的事情:

import re

# TODO: Read file and get list of lines

l = ['Volumes/hard_disc/u14_cut/u14**m12.40**_all.beta/beta8',
    'Volumes/hard_disc/u14_cut/u14**m12.50**_all.beta/beta8',
    'Volumes/hard_disc/u14_cut/u14**m11.40**_all.beta/beta8',
    'Volumes/hard_disc/u14_cut/u14**mm11.40**_all.beta/beta8']

regex = r'^.+\*{2}m{1}(?P<criterion>[0-9\.]*)\*{2}.+$'
p = re.compile(regex)

criterion_list = []

for s in l:
    m = p.match(s)
    if m:
        crit = m.group('criterion')
        try:
            crit = float(crit)
        except Exception as e:
            crit = 0
    else:
        crit = 0
    criterion_list.append(crit)


tuples_list = list(zip(criterion_list, l))
output = [element[1] for element in sorted(tuples_list, key=lambda t: t[0])]
print(output)

# TODO: Write output to new file or overwrite existing one.

,并提供:

['Volumes/hard_disc/u14_cut/u14**mm11.40**_all.beta/beta8', 'Volumes/hard_disc/u14_cut/u14**m11.40**_all.beta/beta8', 'Volumes/hard_disc/u14_cut/u14**m12.40**_all.beta/beta8', 'Volumes/hard_disc/u14_cut/u14**m12.50**_all.beta/beta8']

在从文件中读取所有行并将其存储到列表(此处称为l的列表)之后,此片段开始。正如您在regex101上看到的那样,正则表达式组criterion捕获**m12.50**中包含的浮动部分。因此,遍历所有行会为您提供一个包含所有匹配组作为浮点数的新列表。如果正则表达式在给定字符串上不匹配或将组转换为浮点数失败,则crit设置为零,以便稍后在排序列表的最开头处包含这些无效行。

之后zip()用于获取包含提取的浮点数和相应字符串的图表列表。现在,您可以根据元组的第一个元素对这个元组列表进行排序,并将相应的字符串写入新列表output