python raw_input() 개행 없이 문자열 입력 받는 방법


python에서 raw_input()으로 입력을 받을 때 여러 줄을 복사, 붙여넣기 할 경우 아래와 같은 문제가 발생합니다.


string = raw_input()

=====

입력


string1

string2

string3


=====

출력

string1

입력은 여러 줄을 받았으나 string1 뒤의 \n으로 인해 변수에 한 줄만 입력되게 됩니다.

흔히 생각할 때는 string변수에 'string1\nstring2\nstring3\n'으로 입력될 것 같지만 

python에서 \n를 엔터로 입력받아버려 이런 문제가 발생합니다.


이를 해결하기 위해서는 2가지 방법이 있습니다.


1. import sys

2. 반복문을 사용한 raw_input()


1번의 경우 아래와 같은 코드로 입력받을 수 있습니다.

import sys


string = sys.stdin.readlines()

출력 결과

>>> 

string1

string2

string3




['string1\n', 'string2\n', 'string3\n', '\n', '\n', '\n']

sys 라이브러리를 썼을 경우 \n을 그대로 받아 변수에 저장이 가능하지만

입력을 종료하기 위해 엔터를 입력하는 것까지 \n으로 받아버리기 때문에 약간의 문제가 발생합니다.

이 경우 IDLE에서는 Ctrl+D로 종료가 가능하며, windows console에서는 Ctrl+Z로 입력 종료가 가능합니다.

둘 다 EOF(End of File)을 입력하는 방법이며, 키보드 인터럽트를 받아 공백을 입력 받았을 때 종료시키는 코드를 짜도 됩니다.



2번의 경우는 반복문을 사용하여 여러번의 raw_input()을 사용함과 동시에

append()를 사용하여 리스트 형식으로 문자열을 계속 더하는 방법입니다.

string = []

while True:

    input_data = raw_input()

    if input_data == '':

        break

    else:

        string.append(input_data)


for line in string:

    print line

출력 결과

>>> 

string1

string2

string3


string1

string2

string3

여러줄의 string1~3을 받고 엔터를 두 번 입력할 경우 결과가 출력됩니다.

1번의 경우보다 코드가 조금 더 길지만 문자열을 라인 단위로 리스트에 저장하기 때문에

좀 더 다루기가 편리한 방법입니다.

위 코드에서 print string[1]을 하면 string2가 출력되는 식입니다.


코드를 좀 더 살펴보면, while문을 통해 반복적으로 raw_input()으로 입력을 받으며,

공백이 아닌 입력된 문자열이 있을 경우 append()를 통해 string 리스트에 계속 더하게 됩니다.


입력받을 문자열에 따라 두 방법 중 편한 방법을 선택하여 사용하면 됩니다.



Python에서 continue와 pass의 차이점


우선 continue는 for문, if문 같은 곳에서 사용 시 다음 루프로 넘기는 역할을 합니다.

pass는 아무 역할 없이 단순히 코드 진행을 하게 됩니다.


아래 코드를 실행해보면 좀 더 이해가 쉽습니다.


for x in range(1, 6):

    if x:

        print "x is %d" % x

        pass

    print "Pass"


for y in range(1, 6):

    print "continue_before"

    if y:

        print "y is %d" % y

        continue

    print "continue_after"


그리고 아래 결과는 아래와 같습니다.


x is 1

Pass

x is 2

Pass

x is 3

Pass

x is 4

Pass

x is 5

Pass

continue_before

y is 1

continue_before

y is 2

continue_before

y is 3

continue_before

y is 4

continue_before

y is 5


pass를 사용한 for문에서는 pass가 있는듯, 없는듯 loop가 돌아가는 것을 볼 수 있습니다.

반면, continue를 사용한 for문에서는 continue_after가 실행되지 않고 있습니다.

즉, continue문이 실행되는 순간 다음 loop로 넘어가버리므로 실행되지 않게 됩니다.


그럼 이 쓸모없어 보이는 pass문은 어디에 쓰냐면 python에서는 에러관리를 위해 try: except: 문을 사용합니다.

이때 에러가 발생하더라도 계속 코드를 진행시키기 위해 except:문에서 pass를 사용하는 경우가 많습니다.


이전 포스팅([Language/Python] - Python shutil copytree 사용 파일 복사)에서는 shutil을 이용하여

경로 중간의 폴더가 없더라도 생성해가며 해당 경로로 파일을 복사하는 방법이었습니다.


이번 방법은 파일 복사가 아닌 중간 경로의 폴더가 존재하지 않더라도 생성해가면서 경로를 완성하는 방법입니다.

예를 들어 os.mkdir로 C:\test\test1\test2\test3라는 경로가 필요한데 test1, test2라는 중간 경로의 폴더가 없다면, 

'WindowsError: [Error 3] : '경로''에러가 발생합니다.



이 경우 os.makedirs()를 사용한다면, 경로를 따라가면서 폴더를 생성하게 됩니다.


사용 라이브러리 : os > makedirs


import os


os.makedirs("C:\\test\\test1\\test2")



  1. 2016.06.13 09:29

    비밀댓글입니다



가끔 파일 복사를 해야할 때 C:\test에 있는 모든 파일을 D:\copy\copy1\copy2로 옮기고 싶은데 \copy\copy1\copy2의 경로가 없을 때가 있습니다.

즉, 폴더가 없다면 생성해가면서 지정된 위치로 파일을 복사하는 방법입니다.


사용 라이브러리 : shutil > copytree


import shutil


shutil.copytree(src, dst, symlink=False, ignore=None)


예제 :


import shutil


shutil.copytree('C:\\srcfolder', 'D:\\dstfolder\\folder1\\folder2\\folder3')


결과 :


텍스트로 출력되는 결과가 아니라 제대로 보여드리긴 어렵지만 위 처럼 folder1,2,3이 순차적으로 생성되고,

c:\srcfolder에 있는 파일들이 모두 복사가 됩니다.


주의할 점은 폴더 경로 작성 시 백슬래시(\) 한 개가 아닌 2개(\\)를 써줘야 경로를 제대로 인식합니다.


거의 3년만에 초대장 배포를 해보네요.

왜인지 모르겠지만 초대장이 몇 장 남아있던데,

티스토리에 가입하시고자 하는 분들을 위해 초대장 배포합니다.



초대장 신청은 댓글을 통해 받으며, 스팸/불법 홍보 등을 목적으로 하는 신청자는 블로그 개설 확인 후 즉시 신고합니다.

열심히 하실 필요도 없고 그저 '만들고자 하는 블로그의 주제'만 있으면 됩니다.

댓글로 아래 초대장 신청 양식에 맞춰 남겨주세요.


------------

이메일 : *******@tistory.com (초대 받을 이메일 주소)

블로그 개설 목적 : 

------------



양식은 매우 간단하지만 초대장을 받고 싶어하는 분들이 생각보다 많으니 정성껏 적어주시는 분들 우선 초대드립니다.

  1. 2016.05.31 22:24

    비밀댓글입니다

+ Recent posts