파이썬 if 구문 내 변수 선언

gksrb500의 이미지

안녕하세요.
갑작스러운 노가다 프로젝트 때문에 이번에 코딩을 'trial and error' 방식으로 공부하고 있는 학생입니다.

제가 하고자 하는 것은 a="파일 1", b="파일 2", c="파일 3" 이렇게 파일에 대해서 변수를 선언하고자 합니다.

파일 1: 파일명에 rcp라는 단어를 반드시 포함하는 .xlsx 파일
파일 2: 파일명에 PM이라는 단어를 반드시 포함하는 확장자 없는 파일
파일 3: 랜덤한 이름으로 생성되는 .xlsx 파일

이 논리를 이용해서 if 구문으로 변수 선언을 하고, if 구문 이후에 변수를 사용하려고 했습니다.
(일부분을 잘라서 왔습니다.)

for i in folder_num:
    fpath_2 = fpath + '\\' + i
    flist = os.listdir(fpath_2)
    print(flist)
 
    for s in flist:
        if 'rcp' in s:
            rcp_file = fpath_2 + '\\' + s
 
        elif 'PM06' in s:
            log_file = fpath_2 + '\\' + s
 
        else:
            detect_file = fpath_2 + '\\' + s
 
        print(rcp_file)
        print(log_file)
        print(detect_file)

우선 제가 해본 것은 이렇게 했는데 log_file 변수가 정의되지 않았다고 나왔습니다. 제 질문은

1. 파일명에 rcp가 포함된 파일은 rcp_file, PM06이 포함된 파일은 log_file, 그 외에는 detect_file 이런 식으로 코딩을 했다고 생각했는데 왜 log_file부터는 정의가 안됐다고 나오는지 궁금합니다.

2. 그럼 이 방식으로 해결하려면 어떻게 수정해야 할까요? (파이썬 및 코딩을 이해하면서 공부하고자 질문드립니다.)

-------print 함수를 if-elif-else 사이사이에 껴 놓으면 제가 원하는 대로 나옵니다.

3. 쌩초보라서 간단하게 할 수 있는 코딩을 어렵고 길게 가려고 하는 것 같은데, 혹시 더 좋은 코드가 있을까요?

라스코니의 이미지

우선 rcp 파일, PM06 파일, 기타 파일 순으로 읽혀진다고 봐야 겠네요.
print(rcp_file)
print(log_file)
print(detect_file)
가 호출되면 처음에 rcp_file에 값이 assign되면서 rcp_file 객체가 생성되었을 겁니다. 그래서 print(rcp_file)은 잘 찍힐 거예요.
그다음에 print(log_file)은 log_file 자체 객체가 없기 때문에 python interpreter가 오류가 나면서 실제로 종료가 될 겁니다.

해결책은 1) rcp_file = "", log_file = "", detect_file = "" 식으로 맨 위에 초기화를 하거나, 2) 3개 프린트 문을 for loop 밖으로 빼는 겁니다.

전체적인 코드는 보기 좋습니다. 누가 뭐라고 하던 try and error로 하는게 잘 하시는 겁니다. 그게 제일 실력 향상에 도움이 될 겁니다.

gksrb500의 이미지

답변 진심으로 감사드립니다.

print(rcp_file), print(log_file), print(detect_file)이 같은 if 구문 안에 속해 있는데(tab) rcp_file만 객체가 형성되는지 이해가 가지 않습니다...

우선 말씀해주신대로 맨 위에 rcp_file="", log_file="", detect_file="" 를 위에 넣어 초기화했더니 잘 됩니다.

미리 변수에 텅빈 객체를 지정해주고 난 후, if 조건문으로 다시 변수 지정을 해주면 되지만, 텅 빈 객체를 지정을 안해줬을 시에 왜 안되는지 이유가 궁금합니다!

이해를 하지 않고 넘어가면 다음에도 같은 실수를 반복할 것 같습니다!

다시 한번 답변 감사드립니다

라스코니의 이미지

if-elif-else 중 하나만 실행됨으로 (처음에는 rcp_file에 할당이 이루어짐) 다른 log, detect 는 할당이 안이루어 지죠.

그후 3개 연속 print()에서 첫번째만 rcp_file 객체가 있기에 출력되고, 나머지 print()는 log, detect의 할당이 안이루어져서 객체 자체가 생성되지 않았음으로 fail나서 전체 소프트웨어가 종료되는 겁니다.

결과적으로는 소프트웨어가 실행중에 fail나서 그런거예요. 그래서 elif-else 문장이 돌지 않는거죠.

gksrb500의 이미지

아 이해했습니다!

기존에는 bash로 단순 노가다 작업을 진행했다가, unix 환경이 아닌 곳에서 코드가 필요해져서 파이썬을 배우고 있는데 생각보다 문법이 많이 다르네요.

정말 감사드립니다!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.