2017-12-05 4 views
1
import os 

target_dir = "xxx.xxx.xx.xx/path/to/file/dir" 
start_seq = "*** Start Sequence ***" 
end_seq = "*** End Sequence ***" 

def tp_parser(file): 
    with open(file) as in_f: 
     lines = in_f.readlines() 
     f_name = in_f.name[12:16] 

     for i, line in enumerate(lines): 
      if line.startswith(start_seq): 
       start_line = i 
      elif line.startswith(end_seq): 
       end_line = i 

     with open("{0}_Target_Map.txt".format(f_name), "w") as out_f: 
      for i, line in enumerate(lines): 
       if start_line <= i < end_line: 
        print(line) 
        # out_f.write(line) 

for file in os.listdir(os.chdir(target_dir)): 
    tp_parser(file) 

이 스크립트를 작성하여 파일 디렉토리를 살펴보고 각 파일의 특정 부분을 추출하여 별도의 텍스트 파일에 기록합니다. 호기심 누군가가이 부분은 여기 무슨 일이 일어나고 있는지에 대한 몇 가지 빛 ...예기치 않은 print() 및 os.listdir() 기능

빛날 수있는 경우 : I 인쇄 (라인)으로 스크립트를 실행하는 경우

if start_line <= i < end_line: 
    print(line) 
    # out_f.write(line) 

내가 다시 얻을 "UnboundLocalError을 : 지역 변수 ' end_line '할당 전에 참조 됨'오류가 발생했습니다. 그러나 out_f.write (줄)을 사용하여 스크립트를 실행하면 의도 한대로 작동합니다.

둘째 약간 덜 성가신 문제는이 부분이다 : 나는 (즉 os.chdir (TARGET_DIR)) 실제로 반복하는 작업 디렉토리로 전환해야하는 이유가 자신에게 설명 할 수

for file in os.listdir(os.chdir(target_dir)): 
    tp_parser(file) 

파일. 나는 os.listdir() 자체가 파일 이름 목록을 반환한다는 것을 알고 있지만 os.listdir()에서 os.chdir() 인수를 전달하면 그 차이점이 무엇인지 알 수 있습니다.

미리 감사드립니다.

답변

2

결국 시작으로 반복 작업을 수행 할 필요가 없습니다. 목표물 명단을 올리시겠습니까? 따라서 현재를 chdir으로 변경하거나 dir을 listdir으로 지정하십시오. 첫 번째 것을 사용하고 있지만 chdir은 결과가 아닌 옆 효과로 dir을 변경합니다. chdir가 반환됩니다. 따라서 을 None으로 호출하면 현재 행을 사용하는 힌트로 None을 단순한 행운으로 받아들입니다. 당신은

os.chdir(target_dir) 
for file in os.listdir(): 
    tp_parser(file) 

또는 첫 번째 문제에 관해서는

for file in os.listdir(target_dir): 
    tp_parser(file) 

, 당신은 조건문으로 start_lineend_line를 할당하는 것을 알 작성할 수 있습니다. 나는 당신의 문제가 때로는 조건 중 하나가 충족되지 않습니다 코드에서 나중에 할당되지 않은 이름을 사용하여 오류가 나타납니다 용의자.

편집 :

이 코드와 함께, 당신은 당신이 나열되어 같은 디렉토리에 출력 파일을 작성하는 또 다른 문제도있다. 다음에 코드를 실행하면 코드가 마지막 출력 파일을 구문 분석합니다. 나는 이것이 의도 된 행동이 아니라고 생각한다. 당신이 갈 경우 만 출력에 대한 조건을 제외로 출력 파일은 최종 마커가없는 것을 볼 수 있습니다 :

if start_line <= i < end_line: # use of < instead of <= end_line excludes end marker from output 

그래서이 경우에 오류가 사이에 나타나는 단지 잘못된 형식의 새로운 입력 파일입니다 다른 사람. 그리고 이것은 예기치 않은 동작이 아닌 실수로 인한 우연한 일치입니다 (사용자 오류).

+0

답변 주셔서 감사합니다. 두 개의 후속 질문 : 1. 실행 중 : os.listdir (target_dir)의 파일에 대해 : tp_parser (파일) 파일을 찾을 수 없음 오류가 발생합니다. 이것은 내가 파일 문자열을 open (파일)에 삽입하려고 시도했기 때문에 os.chdir() (상단 또는 listdir() 중 하나)을 사용하여 임시 해결책으로 사용하도록했습니다. 2.나는 당신이 맞지 않는 조건에 대해 맞다고 생각하지만, 왜 out_f.write (라인)을 사용할 때 같은 에러를 던지지 않을지 궁금하다. – blackmore5

+1

그건 내가 우연의 일치로), 내 대답 편집을 참조하십시오. – progmatico