Python 按字符串对 dat 文件中的行重新排序
Python Re-ordering the lines in a dat file by string
抱歉,如果这是重复的,但我暂时找不到。
基本上我正在打开并读取一个 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
我已经检查了可能的标记重复,但我似乎无法让它为我工作,因为我的文件在技术上不包含字符串和数字。我需要排序的 'number' 包含在整个字符串中:
Volumes/data_disc/u14_cut/from_met/u14m11.40_all.beta/beta16
我需要按 m(somenumber) 部分对整行进行排序
假设您的行的数字部分具有浮点形式,您可以使用正则表达式匹配该部分并将其从字符串转换为浮点。
之后您可以使用此信息对从您的文件中读取的所有行进行排序。我添加了一个无效行以显示如何处理无效数据。
作为一个简单的例子,我会建议这样的事情:
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
.
抱歉,如果这是重复的,但我暂时找不到。
基本上我正在打开并读取一个 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
我已经检查了可能的标记重复,但我似乎无法让它为我工作,因为我的文件在技术上不包含字符串和数字。我需要排序的 'number' 包含在整个字符串中:
Volumes/data_disc/u14_cut/from_met/u14m11.40_all.beta/beta16
我需要按 m(somenumber) 部分对整行进行排序
假设您的行的数字部分具有浮点形式,您可以使用正则表达式匹配该部分并将其从字符串转换为浮点。
之后您可以使用此信息对从您的文件中读取的所有行进行排序。我添加了一个无效行以显示如何处理无效数据。
作为一个简单的例子,我会建议这样的事情:
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
.