(python2.7) SyntaxError: invalid syntax가 뜨는 이유

조회수 1563회

안녕하세요,

밑의 코드는 제가 만든 코드인데,

특정 형식의 파일에서 삽입된 정보들을 추출해 새로운 파일에 써주는 코드입니다.

Xshell에서 실행을 시켜보려 했는데, syntax error가 뜹니다.

문제는 무엇이 문제가 되는지 모르겠다는 것입니다.

[user01]$ python extract_sac_header.py
 File "extract_sac_header.py", line 54
    f.write('\t')
    ^
SyntaxError: invalid syntax

이라고 뜹니다.

저의 코드는

#/usr/bin/python
# file: extract_sac_header.py

import obspy
from obspy import read
import sys
import pickle
import glob

print('Please input data file path')
data_file_path=input()

print('Please input save file path')
save_file_path=input()

print("What do you want to save from sac header?\nYou should keep the order\nExamples are [station, latitude, N or S, longitude, E or W, elevation]")
arg=input()

if arg == None or arg[6] != None:
    print('No information or Extra input value. Check input.')

    break

else:
    continue


def extract(data_file_path,save_file_path,arg):

    read_file = read('data_file_path')

    if read_file == None:
        print('Error! Check data file')
        break
    else:
        continue

    f=open('save_file_path','w')
    f.write('')
    f.close

    for i in range (0,len(read_file)):
        tr=read_file[i]
        f=open('save_file_path','a')

        if arg[5] != None:
            f.write(tr.stats.arg[0])
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[1]))    #degree of latitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60))  #minute of latitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60-int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60)*60)    #second of latitude
            f.write('\t')
            f.write('arg[2]')               #North or South hemispere notification
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[3]))    #degree of longitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60))  #minute of longitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60-int((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60)*60)    #second of longitude
            f.write('\t')
            f.write('arg[4]')               #East or West hemispere notification
            f.write('\t')
            f.write('%s' % tr.stats.sac.arg[5]) #height of elevation (meter)
            f.write('\n')
            f.close

        elif arg[0] != None and arg[1] == None:
            f.write(tr.stats.arg[0])
            f.write('\n')
            f.close

        elif arg[1] != None and arg[2] == None:
            f.write(tr.stats.arg[0])
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[1]))    #degree of latitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60))  #minute of latitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60-int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60)*60)    #second of latitude
            f.write('\n')
            f.close         


        elif arg[2] != None and arg[3] == None:
            f.write(tr.stats.arg[0])
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[1]))    #degree of latitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60))  #minute of latitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60-int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60)*60)    #second of latitude
            f.write('\t')
            f.write('arg[2]')               #North or South hemispere notification
            f.write('\n')
            f.close

        elif arg[3] != None and arg[4] == None:
            f.write(tr.stats.arg[0])
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[1]))    #degree of latitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60))  #minute of latitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60-int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60)*60)    #second of latitude
            f.write('\t')
            f.write('arg[2]')               #North or South hemispere notification
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[3]))    #degree of longitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60))  #minute of longitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60-int((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60)*60)    #second of longitude
            f.write('\n')
            f.close

        elif arg[4] != None and arg[5] == None:
            f.write(tr.stats.arg[0])
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[1]))    #degree of latitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60))  #minute of latitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60-int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60)*60)    #second of latitude
            f.write('\t')
            f.write('arg[2]')               #North or South hemispere notification
            f.write('\t')
            f.write('%s' % int(tr.stats.sac.arg[3]))    #degree of longitude
            f.write('\t')
            f.write('%s' % int((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60))  #minute of longitude
            f.write('\t')
            f.write('%s' % ((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60-int((tr.stats.sac.arg[3]-int(tr.stats.sac.arg[3]))*60)*60)    #second of longitude
            f.write('\t')
            f.write('arg[4]')   
            f.write('\n')
            f.close

        else:
            print('Error! Check input data and path.')

    if arg[5] != None:
        print("%s's header %s, %s, %s, %s, %s, %s are recorded in %s" % data_file_path % arg[0] % arg[1] % arg[2] % arg[3] % arg[4] % arg[5] % save_file_path)

    elif arg[0] != None and arg[1] == None:
        print("%s's header %s is recorded in %s" % data_file_path % arg[0] % save_file_path)

    elif arg[1] != None and arg[2] == None:
        print("%s's header %s, %s are recorded in %s" % data_file_path % arg[0] % arg[1] % save_file_path)

    elif arg[2] != None and arg[3] == None:
        print("%s's header %s, %s, %s are recorded in %s" % data_file_path % arg[0] % arg[1] % arg[2] % save_file_path) 

    elif arg[3] != None and arg[4] == None:
        print("%s's header %s, %s, %s, %s are recorded in %s" % data_file_path % arg[0] % arg[1] % arg[2] % arg[3] % save_file_path)    

    elif arg[4] != None and arg[5] == None:
        print("%s's header %s, %s, %s, %s, %s are recorded in %s" % data_file_path % arg[0] % arg[1] % arg[2] % arg[3] % arg[4] % save_file_path)

    else:
        print("Error! Check saved file.")

다음과 같습니다..

거의 처음 만들어보는 코드라서 난잡합니다..

문제가 되는 부분은 54번째 줄 f.부분이라는데, 이 부분을 어떻게 고쳐야 하는지 모르겠습니다.

그리고 혹시 코드를 더 간단하게 만들 수 있는 방법도 알려주시면 감사하겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 53번 라인 닫는 괄호 하나가 빠졌습니다.

    f.write('%s' % ((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60-int((tr.stats.sac.arg[1]-int(tr.stats.sac.arg[1]))*60)*60)
    # 여는 괄호 7개 닫는 괄호 6개
    

    그리고 사실 이거 비슷하게 생긴 모든 라인들이 닫는 괄호가 하나씩 없어요. #second of long/lat 코멘트 달린 라인들이요. 이런 문제는 파이썬 코드 스니핑을 해주는 에디터(VS Code, Sublime Text 등)를 사용하시면 예방 가능합니다.

    + 코드를 간결하게 만드는 걸 리팩토링이라고 하는데요. 그걸 하려면 이 프로그램이 뭘 하는 프로그램이며 목적과 전제가 뭐며 등등이 다 알려진 상태로 상당히 오랫동안 들여다봐야 하기 때문에 누구든지 섣불리 알려드릴 수 없습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)