2012-03-25 2 views
2

비슷한 질문을한데 모으려고 시도했지만 비참하게 실패했습니다. 나는 아직 파이썬에 대해 충분히 모른다 :(목록에서 파일의 줄을 반환하십시오.

을 나는 특정 순서의 예에 inputlist 포함하는 요소가 있습니다

"ERD","Data","Data"... 
"KIN","Data","Data"... 
"FAC","Data","Data"... 
"GRE","Data","Data"... 
: ["GRE", "KIN", "ERD", "KIN"]

을 나는 datafile 요소를 포함, 플러스 다른 데이터 예를

나는 그들이 inputlist에 나타나는 순서대로 datafile에서 선을 포함하는 outputlist을 작성해야합니다.

을 아래 코드는 의도 된 행동하지 않은이 datafile에 나타나는 순서에있는 outputlist를 반환 ... : - \

with open(inputfile, 'r') as f: 
    names = [line.strip() for line in f] 

outputlist = [] 

with open(datafile, 'r') as f: 
    for line in f: 
     name = line.split(',')[0] 
     if name[1:-1] in names: 
      outputlist.append(line) 
    output = open(outputfile, 'w') 
    output.writelines(outputlist) 

어떻게가 올바른 순서로 목록을 반환 할 수 있습니다?

datafile = 'C:\\testing\\bldglist.txt' 
inputfile = 'C:\\testing\\inputlist.txt' 
outputfile = "C:\\testing\\output.txt" 

with open(inputfile, 'r') as f: 
    inputlist = [line.strip() for line in f] 

def outputList(inputlist, datafile, outputfile): 
    d = {} 
    with open(datafile, 'r') as f: 
     for line in f: 
      line = line.strip() 
      key = line.split(',')[0] 
      d[key] = line 
    with open(outputfile, 'w') as f: 
     f.write('"Abbrev","Xcoord","Ycoord"\n') 
     for key in inputlist: 
      f.write(d[key] + '\n') 

outputList(inputlist, datafile, outputfile) 
+2

데이터 파일의 크기는 어느 정도입니까? 메모리에 쉽게 맞으면 데이터 파일에서 사전을 작성할 수 있습니다. –

+1

그리고 그렇지 않으면 '선반'이 있습니다. –

+0

이들은 모두 매우 작은 텍스트 파일이며'datafile'의 단지 164 줄입니다 – TheMapSmith

답변

1

출력 파일 예상 된 순서.

+0

답장을 보내 주셔서 감사합니다. 나는 나의 질문을 약간 쥐었다. 주문 문제를보다 쉽게 ​​볼 수 있도록 예제로 A, B, C, D를 사용했습니다. 라인은 실제로 당신이 지금 볼 수있는 것처럼 3 글자 코드로 시작합니다. – TheMapSmith

+0

@SteveS 내 솔루션이 동일하게 작동합니다. 코드 길이가 1 ~ 3 자이면 문제가되지 않습니다. –

+1

작동했습니다! 아름다운. 다시 한 번 감사드립니다 :) – TheMapSmith

5

이 쉬운 솔루션입니다 :

편집

감사의 오스카에 :-) 당신의 도움에 미리 감사드립니다, 이것은 내가 구현 된 솔루션입니다. 전체 입력 파일을 첫 번째 문자 : 라인 사전으로 메모리에 읽습니다. 쓰기 순서대로 줄을 쓰는 것은 쉽습니다.

파일이 매우 (기가 바이트)이거나 많은 메모리가없는 경우 다른 방법이 있습니다. 그러나 그들은 거의 좋지 않습니다.

테스트하지 않았습니다.

def outputList(inputlist, datafile, outputfile): 
    d = {} 
    with open(datafile, 'r') as f: 
     for line in f: 
      line = line.lstrip() 
      key = line.split(',')[0] 
      d[key] = line 
    with open(outputfile, 'w') as f: 
     for key in inputlist: 
      f.write(d[key]) 

이처럼 사용 :

outputList(['"GRE"', '"KIN"', '"ERD"', '"KIN"'], 
      '/path/to/datafile', 
      '/path/to/outputfile') 

그것은을 쓸 것이 솔루션을 시도

"ERD","Data","Data"... 
"KIN","Data","Data"... 
"FAC","Data","Data"... 
"GRE","Data","Data"... 

:이 형식의 데이터 파일을 가정

import csv 

data = {} 
with open(datafile) as f: 
    for line in csv.reader(f): 
     data[line[0]] = line 

with open(outputfile, "w") as f: 
    f = csv.writer(f) 
    for entry in inputlist: 
     f.writerow(data[entry]) 
+0

답장을 보내 주셔서 감사합니다. 내 질문을 약간 수정했습니다. 주문 문제를보다 쉽게 ​​볼 수 있도록 예제로 A, B, C, D를 사용했습니다. 라인은 실제로 당신이 지금 볼 수있는 것처럼 3 글자 코드로 시작합니다. 내 데이터로 코드를 실행할 때'KeyError : ' "PAR"' – TheMapSmith

+0

감사합니다, Niklas. 나는 Oscar의 솔루션을 성공적으로 구현했지만, 이번에는 더 많은 표를 얻었습니다. 호기심에서 이걸 선호하는 이유는 무엇입니까? – TheMapSmith

+0

@Steve S :이 중 하나가 먼저 있었고, 다른 대답은 기본적으로 복사했습니다 (적어도 똑같은 논리를 사용함). 이 답변은 적절한 CSV 파서를 사용하기 때문에 실제로 더 좋습니다. 이 버전에서는 작은 버그가 수정되었으므로 원하는대로 사용할 수 있습니다. –

0

1) 매핑 할 요소가있는 목록을 만듭니다. 이 경우 ["GRE", "KIN", "ERD", "FAC"]

2) 파일을 읽고 목록 사전을 사용하여 첫 번째 요소를 매핑합니다.

3) 파일로 출력.

import csv 

out_index=["GRE", "KIN", "ERD", "FAC"] 
d={} 
with open('/Users/andrew/bin/SO/abcd.txt','r') as fr: 
    for e in csv.reader(fr): 
     if e[0] not in d: d[e[0]]=[] 
     for ea in e[1:]: 
      d[e[0]].append(ea) 

for i in out_index: 
    print i,":" 
    for e in d[i]: 
     print ' ',e 

이 예제 데이터를 감안할 :

"ERD","Data-a1","Data-a2" 
"KIN","Data-b1","Data-b2" 
"FAC","Data-c1","Data-c2" 
"GRE","Data-d1","Data-d2" 
"ERD","Data-a3","Data-a4" 
"GRE","Data-d3","Data-d4" 

는 출력 :

GRE : 
    Data-d1 
    Data-d2 
    Data-d3 
    Data-d4 
KIN : 
    Data-b1 
    Data-b2 
ERD : 
    Data-a1 
    Data-a2 
    Data-a3 
    Data-a4 
FAC : 
    Data-c1 
    Data-c2 

는 완료!

관련 문제