2016-07-21 4 views
0

죄송합니다. 반복이지만 죄송 합니다만 지금 찾으실 수 없습니다.Python 문자열로 dat 파일의 라인 순서 바꾸기

기본적으로 나는 특정 정보를 얻기 위해 반복해야하는 경로가 들어있는 파일을 열고 읽는 중입니다.

base.dat 파일의 각 줄은 m.somenumber입니다. 예를 들어 파일의 일부 라인은 수 있습니다 : 모든 라인이 가장 큰 m.number에서 가장 작은 m에 다시 정렬되도록

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 파일을 다시 쓸 수 있어야합니다. 번호. 그런 다음 데이터베이스에서 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) 부분

+0

그래서 문제가 무엇입니까? – Harsha

+0

[파이썬 - 문자열과 숫자를 포함하는 목록의 숫자 값 정렬] 가능한 중복 (http://stackoverflow.com/questions/34288774/python-ordering-number-values-in-a-list-containing-strings-and) -number) – Julien

+0

@HarshaBiyani 문제는 기본 .dat 파일의 모든 줄을 줄의 특정 문자열에 따라 숫자로 정렬해야한다는 것입니다. 순서가 지정되지 않은 경우 경로를 통해 반복 할 때 매개 변수 mu 및 delta가 무질서하게됩니다.나중에 다시 매개 변수에 대한 경로를 통해 내 코드에서 별도로 루프를 다시 수행해야하므로 배열을 올바른 순서로 일치시키지 않아서 다시 정렬 할 수 없습니다. –

답변

0

하여 전체 라인을 정렬 할 필요가 라인의 형식은 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). 정규식 그룹 criterionregex101에서 볼 수 있듯이 **m12.50**에 포함 된 float 파트를 포착합니다. 따라서 모든 행을 반복하면 일치하는 모든 그룹을 수레로 포함하는 새로운 목록을 얻을 수 있습니다. 정규식이 주어진 문자열에서 일치하지 않거나 그룹을 부동 소수점 형변환에 실패하면 crit은 나중에 정렬 된 목록의 처음에 유효하지 않은 행을 가지기 위해 0으로 설정됩니다.

그 후 zip()은 추출 된 float 및 해당 문자열을 포함하는 줄의 목록을 가져 오는 데 사용됩니다. 이제 튜플의 첫 번째 요소를 기반으로이 튜플 목록을 정렬하고 해당 문자열을 새 목록 output에 쓸 수 있습니다.

+0

감사합니다.이 접근 방식은 완벽하게 작동합니다! 코드의 각 부분이 무엇을하고 있는지에 대한 훌륭한 설명. 1up을 제공 하겠지만이 계정을 만들었으므로 의견이 없습니다. –

+0

이것이 당신의 질문을 해결했다면 당신의 질문을 마감이라고 표시하기 위해 대답을 체크하십시오. – albert

+0

죄송합니다 완전히 혼란스러워, 정말 고마워! –

관련 문제