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. 2021.09.11 완료
  2. wildgoose
    파일이름에 순서를 부여해서.. 01_html 02_css 03_javascript
    files = os.listdir('data') # [01_html, 02_css, 03_javascript]
    file_names = []
    for i in files :
    file_names.append(i[3:]) #파일목록에서 텍스트만빼서 새로운 배열에 담았습니다.

    for item in file_names :
    ---이하는 같음---

    이런식으로도 한번 해보았습니다.
  3. wildgoose
    순서가 다르게 나오는것을 구글검색 how to reorder list in python 검색하여
    files = os.listdir('data') #return [css, html, javascript] 알파벳순으로 정렬됨
    myOrder = [1,0,2]
    ordered_files = [files[i] for i in myOrder] #return [html, css, javascript]

    if 'id' in ordered_form:
    ----이하는 같음---
    요렇게 변경해서 순서를 정렬해보았습니다.
  4. 안준모
    DATA 파일에서 불러오던중 "UnicodeDecodeError:'cp949' codec can't decode byte 0xe2 in position 6987: illegal multibyte sequence" 오류가 날때
    description = open("data/"+pageId, 'r').read() 를
    description = open("data/"+pageId, 'rt',encoding='UTF8').read()으로 바꾸면 해결됩니다.
    cp949 코덱으로 인코딩 된 파일을 읽어들일때 이런 문제가 생긴다고 하는군요.
    대화보기
    • 안준모
      한글 깨짐 오류가 있으신분들 아래 스크립트를 추가하시면 해결됩니다!
      import sys
      import io
      sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
      sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')
    • 이택진
      210520
    • 초딩 개발자
      2021/05/10
    • jeisyoon
      2021/.04.09 반복문을 이용하여 글목록 구현 - OK
    • 첫번째 질문은 제 오타 였네요...
      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
                감사합니다 ~
              버전 관리
              egoing
              현재 버전
              선택 버전
              graphittie 자세히 보기