WEB2 - Python

활용 - 반복문을 이용해서 글목록 구현

수업소개

반복문과 파일목록을 가져오는 기능을 활용해서 글목록 기능을 구현하는 방법을 살펴봅니다. 

 

 

강의

 

 

소스코드 

변경사항

index.py

#!/usr/local/bin/python3
print("Content-Type: text/html")
print()
import cgi, os

files = os.listdir('data')
listStr = ''
for item in files:
    listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)
    
form = cgi.FieldStorage()
if 'id' in form:
    pageId = form["id"].value
    description = open('data/'+pageId, 'r').read()
else:
    pageId = 'Welcome'
    description = 'Hello, web'
print('''<!doctype html>
<html>
<head>
  <title>WEB1 - Welcome</title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py">WEB</a></h1>
  <ol>
    {listStr}
  </ol>
  <h2>{title}</h2>
  <p>{desc}</p>
</body>
</html>
'''.format(title=pageId, desc=description, listStr=listStr))

 

댓글

댓글 본문
  1. 이택진
    210520
  2. 초딩 개발자
    2021/05/10
  3. jeisyoon
    2021/.04.09 반복문을 이용하여 글목록 구현 - OK
  4. 첫번째 질문은 제 오타 였네요...
    index.py?id={name}
    에 등호 ( = ) 안 붙여서 생긴 문제였어요.
    대화보기
    • 한글화

      1. charset= euc-kr
      : 파이썬 파일 내의 한글화 (띄어쓰기로 오류날 수 있으니 유의)

      #!python
      print("content-type: text/html; charset= euc-kr")
      print()

      2. encoding="utf-8"
      : data폴더 내의 파일들의 한글화 (utf-8을 따옴표 안에 넣는거 유의)

      description = open("data/"+pageId, "r", encoding = "utf-8").read()

      아래 댓글을 참고하여 해결하였습니다.
    • 강의에서 file은 예약된 단어라서 item으로 바꿨는데요.
      python key word list에는 없던데 어디에 예약된 단어인지 궁금해요.
    • for문을 사용하면서 description과 title 부분이 각 파일과 id를 못 읽고 False값인
      Welcome
      Hello, web
      만 표현되네요.

      이번 강의의 files와 for문과 지난 시간에 작성한 form과 if를 바꾸면 해결될까 했는데
      여전히 똑같고요.


      또한, SongSong님 질문처럼 파일 이름 순서대로 배치되는 것도 해결 못하겠네요.

      강의를 보다보면 퍼득 떠오르거나 연관된 지식을 얻을 수 있겠죠..? 일단 다음 강의 갑니다. ㄱㄱ
    • 'os 모듈을 사용'하여 'data'디렉토리의 파일을 리스트로 만든다.
      files = [CSS, HTML, JavaScript, Python]
      까지 이해하고
      listStr = listStr + item
      표현식에서 또 헷갈렸네요. 예전에 C 배웠을 때도 헤매었던거 같은데 또 다시 헤매임의 반복이라니 ㅠㅠ


      처음에 listStr 값이 없으면, 값이 없어 오류가 발생함으로
      listStr = '' 공백을 넣어 주신 겁니다.
      헷갈리시면
      listStr = '-' 문자를 넣어 보세요.

      그러면 이제 다시 표현식으로 돌아가서
      listStr의 처음값과 item 값을 가져옵니다. (괄호 안에 숫자는 반복문 회전 수 입니다.)
      (1) ' - + CSS ' 이게 listStr(1) = -CSS 결과가 됩니다.
      (2) ' -CSS + HTML ' 즉, listStr(2) = -CSSHTML
      이걸 리스트 요소 끝에 갈 때까지 합니다.
      (3) ' -CSSHTML + JavaScript ' = listStr(3)
      (4) ' -CSSHTMLJavaScript + Python ' = listStr(4)

      for 반복문 뒤에 print를 해보면,
      print(listStr) >>> -CSSHTMLJavaScriptPython
      4번 반복해서 나온 결과인 listStr(4) 결과가 나오게 됩니다.

      만일,
      listStr = item
      print(listStr)
      을 하게되면 'Python' 결과 하나밖에 안 나오는 것을 확인할 수 있습니다.
    • younghwani
      완료!
    • ok
    • 박민지
      2021.01.15
    • wook9133
      data 파일안 본문에 한글을 써서 한글 깨짐 있으신 분들 describe에 encoding="utf-8" 넣으면 해결 됩니다.
      description = open("data/"+pageId, "r", encoding="utf-8").read() 이렇게 넣으면 될것 같아요!
    • seongsu
      2020.10.14
    • dagel0102
      20.10.09
    • cgoing
      cgoing / 2020.10.02
    • DCNOMAD
      <body>
      <h1><a href="index.py">WEB</a></h1>
      <ol>
      {listStr}
      </oL>
      <h2>{title}</h2>
      <p>{desc}</p>
      </body>

      똑같이 입력해도 title 과 description 영역이 같이 링크화 되고

      {listStr}의 목록이 안나오는 건 어떤 문제가 있는걸까요
    • 엄세환
      print("Content-Type: text/html") 대신 print("Content-Type: text/html;charset=UTF-8\n")를 사용해보세요
      대화보기
      • aing
        불러오는 파일에 한글이 써져있으면 오류가 뜨는데 어떻게 하면 오류가 뜨지 않을까요?
      • OneJae EE
        20.05.17 일 / 37세 비전공자 / 완료
      • 악어
        2020-03-12 완료!
      • 스티븐잡숴
        완료
      • dlgus629@naver.com
        아 해결했습니다
        대화보기
        • dlgus629@naver.com
          잘 작동하는데 위에 리스트가 지워지지 않습니다
          게다가 data폴더에 파일을 추가하면
          리스트가 중복되어 쌓이는데
          왜 그럴까요??
        • dj bak
          파이썬
          import os
          files = os.listdir('프로젝트/dataa')
          하면 ['1'.'2'.'3'] <<파일명, 으로 잘나오는데
          웹브라우저로 그대로 나타내면 FileNotFoundError 나옵니다
          근데
          import os
          files = os.listdir('dataa') 로 하면 파이썬은 에러가 나오는데
          웹브라우저에서는 none 이라고 나타납니다 왜 그럴까요ㅜ
        • apldeap
          12/27
        • xuanxi
          20191129
        • 쑤우
          수강완료. 감사합니다~
        • 굼벵이
          완료
        • 20191004 Ted 완료!
        • Leo Kim
          두번 돌려보니까 이해가 되네요! 고지까지 올라왔다니 신나네요
        • Inyeong Gim
          영화보다가 클라이막스에 다다른 기분! 신나네요
        • 열공러
          공부하다 문득 궁금한 점이 생겨서 질문드립니다.
          코드가 실행되면서 title, description, name, id가 어떤 순서로 부여되는지 파악하는것이 이해에 도움이 될 것이라 생각하였습니다.
          그래서 스스로 머릿속에서 코드 8번째 줄의
          for item in files:
          listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)
          과 27번째 줄의 <ol>{listStr}</ol>
          이 부분들에서 item이 data 폴더 내부의 파일명을 돌면서 name이 먼저 부여되고, 그 이후에 index.py?id={name}, <ol>{listStr}</ol> 부분에 의해서 id가 부여되고 그 다음에 id에 맞추어서 description과 title이 부여될 것이다
          라고 판단을 하였는데, 실제로 하나씩 주석처리를 해서 실행해보는 과정에서 8번째 줄의 for문이 없어도 id가 부여된 것을 확인할 수 있었습니다.
          제 느낌상에는 id가 가장 먼저 부여되는 것 같았는데, 왜 이렇게 되는것일까요?
        • 민턴쟁이
          할 수 있습니다.
          print(variable) 하면 됩니다.

          만약variable가 변수명이면 "" 없이 그냥 print(variable) 하면 됩니다.

          문자를 그냥 출력하려면 ""를 씌워야 하더라구요 print("hello python")
          대화보기
          • 민턴쟁이
            data 폴더안에 data 내용의 값을 한글로 하면 에러가 뜨는데
            상단에
            #!python
            print("content-type: text/html; charset= euc-kr\n")
            print()

            이렇케 입력해도 안되는군요

            data폴더안의 파일은 .py가 아니로 .txt 이어서 그런건지요?
            해결방법은?
          • popsapple
            선생님, 다른 언어에서는 print 안에 들어가 있는 string 안에 직접변수를 넣을 수 있는데, 파이썬에서는 저렇게 주입시킬 수 밖에 없는 건가요?
          • 흐름으로는 이해가 가는데 문법적으로는 완벽히 이해가 안 가네요..ㅠㅠ
          • Seankim
            good
          • Lethesriver
            그렇게 쓰면,
            반복문이 돌면서 listStr 에 값이 계속 추가시키는 게 아니라
            값을 계속 갱신시키게 되면서
            반복문 중 맨 마지막 값만 listStr에 저장되겠죠
            대화보기
            • 또또0330
              물개 박수를 치면서 보고 있습니다.!!!! 신나네요!!
            • gogo0920
              Description을 가져오는 문구에서 error가 발생하는데 혹시 저 code 그대로 description을 window에서 가져왔을때 error가 생기는 분 없으신가요?

              입력: description = open('data/'+pageID, 'r').read()

              11 form = cgi.FieldStorage()
              12 pageId = form.getvalue('id')
              => 13 description = open('data/'+pageID, 'r').read()
              14 print('''<!doctype html>
              15 <html>
              description undefined, builtin open = <built-in function open>, pageID undefined
              NameError: name 'pageID' is not defined
              args = ("name 'pageID' is not defined",)
              with_traceback = <built-in method with_traceback of NameError object>
            • powerwithlove
              ^^
            • SongSong
              안녕하세요~
              아톰 에디터에서 파일 추가하면 알파벳 순서대로 저장이 돼서
              그 순서대로 화면에 표시 되는데
              그 순서를 임의로 변경할 수 있는 방법이 혹시 있을까요 ?
            • goyacommae
              아톰 에디터 관련 질문입니다. html태그 안에 있는 파이썬 언어 색이 별도로 표시되는건 어떤 패키지 기능인가요?
            • 만일 listStr = listStr + 를 하지 않으면 listStr에는 맨 마지막 item이 할당 되어 마지막 한개만 표시됩니다.
              의문이 생기면 바로 직접 테스트해보면 스스로 알게 됩니다.
            • illliilllliillliii
              감사합니다 ~
            • novice
              프로그래밍 처음 배우는 노비스입니다. 강의 잘 듣고 있습니다. 항상 감사합니다.^^
              listStr = listStr + ~~~~
              이게 왜 필요한지 이해를 못하고 있습니다. @.@
              그냥 listStr ='<li><a href="index.py?id={name}</a></li>'.format(name=item)
              이렇게 하면 안되는건가요?
            • egoing
              초기화라고 생각하시면 될 것 같습니다.
              대화보기
              • 굿잡
                내용을 비운 변수를 선언한거 아닌가요?
              • 마샤
                listStr = ''

                작은 따옴표 두 개는 왜 붙이는 거죠?
              버전 관리
              egoing
              현재 버전
              선택 버전
              graphittie 자세히 보기