키보드 입력
키보드로 데이터를 입력하기 위해서는 input() 함수를 이용합니다. 이번에는 input() 함수를 이용해 데이터를 입력하고 그값을 받아서 처리하는 방법을 살펴보겠습니다. input() 함수로 데이터를 입력하기 위한 기본 구조는 다음과 같습니다.
data = input("문자열") |
input() 함수 안의 '문자열'은 화면에 표시되고 키보드로 데이터를 입력한 후 Enter를 누르면 입력된 데이터는 문자열 형태로 data 변수에 대입됩니다.
다음 예는 input() 함수로부터 입력받은 데이터를 print() 함수로 출력하는 코드입니다.
In : yourName=input("당신의 이름은? ") print("당신은 {}이군요.".format(yourName)) Out : 당신의 이름은 ? 홍길동 당신의 이름은 홍길동이군요. |
다음은 숫자를 입력한 예입니다.
In : num=input("숫자를 입력하세요: " print("당신이 입력한 숫자는 {}입니다.".format(num)) Out : 숫자를 입력하세요 : 5 당신이 입력한 숫자는 5입니다. |
위에서는 input() 함수로부터 입력받은 숫자를 그대로 출력해서 문제가 없었지만 숫자를 연산에 이용한다면 연산 전에 입력받은 숫자를 정수 혹은 실수로 변환해야 합니다. 이것은 input() 함수로부터 입력받은 데이터는 모두 문자열로 처리되기 때문입니다.
다음은 정사각형의 변의 길이를 입력받아 넓이를 구하는 예입니다.
In : a=input("정사각형 한 변의 길이는?: ") area=int(a)**2 print("정사각형의 넓이: {}".format(area)) Out : 정사각형 한 변의 길이는? 5 정사각형의 넓이 : 25 |
위 코드에서는 정수가 입력될 것이라는 가정하에 int()함수를 이용해 문자열을 정수로 변환한 후에 제곱 연산으로 넓이를 구했습니다. 만약 입력하려고 하는 숫자가 실수면 어떻게 할까요? 다음 예를 살펴보겠습니다.
In : b= input("정사각형 한 변의 길이는?: ") area=float(b)**2 print("정사각형의 넓이: {}".format(area)) Out : 정사각형 한 번의 길이는?: 1.5 정사각형의 넓이: 2.25 |
위 예에서는 입력 숫자를 실수로 가정해 float()함수로 문자열을 실수로 반환해 연산을 수행했습니다. 여기서 코드를 작성할 때는 입력하려는 숫자가 정수인지 실수인지 모르는데 int() 함수와 float() 함수 중 어떤 것을 써야 하는지 의문이 생깁니다. 입력하려는 숫자가 정수인지 실수인지 모를 때는 무조건 float() 함수를 쓰면 됩니다. 즉, 다음의 예처럼 정수를 입력해도 float() 함수를 이용해 실수로 변환한 후에 연산을 수행하면 됩니다. 단, 실수로 변환했으므로 결과는 실수로 출력됩니다.
In : c=input("정사각형 한 변의 길이는?: ") area=float(c)**2 print("정사각형의 넓이: {}.format(area)) Out : 정사각형 한 변의 길이는?: 3 정사각형의 넓이: 9.0 |
파일 읽고 쓰기
코드를 작성하다 보면 출력 결과를 화면이 아니라 파일로 출력하거나 키보드가 아닌 파일에서 데이터를 읽어야 할 때가 생깁니다. 이번 절에서는 데이터를 파일로 출력(즉, 파일로 저장)하는 방법과 데이터가 저장된 파일에서 데이터를 읽는 방법을 살펴보겠습니다.
파일 열기
파일에서 데이터를 읽거나 파일에 데이터를 쓰려면 우선 다음과 같이 파이썬 내장 함수인 open() 을 이용해 파일을 열어야 합니다.
f=open('file_name', 'mode') |
open() 함수는 file_name과 mode를 입력 인자로 받아서 파일을 열고 파일 객체인 f를 반환합니다. 여기서 반환된 파일 객체를 이용해 파일을 읽고 쓰고 닫습니다. open()의 첫 번째 인자인 file_name은 열고자 하는 파일 이름입니다. 두 번째 인자인 모드(mode)는 아래와 같이 파일의 속성을 설정합니다.
mode | 의미 |
r | 읽기 모드로 파일 열기(기본). 모드를 지정하지 않으면 기본적으로 읽기 모드로 지정됨 |
w | 쓰기 모드로 파일 열기. 같은 이름의 파일이 있으면 기존 내용은 모두 삭제됨 |
x | 쓰기 모드로 파일 열기. 같은 이름의 파일이 있을 경우 오류가 발생함 |
a | 추가 모드로 파일 열기. 같은 이름의 파일이 없으면 w와 기능 같음 |
b | 바이너리 파일 모드로 파일 열기 |
t | 텍스트 파일 모드로 파일 열기(기본). 지정하지 않으면 기본적으로 텍스트 모드로 지정됨 |
mode는 혼합해서 사용할 수도 있습니다. 예를 들면, 바이너리 파일을 읽기 모드로 열고 싶으면 mode에 'bw' 혹은 'wb'를 입력합니다. 또한 mode에 아무것도 쓰지 않으면 'rt'와 같은 기능을 합니다. 즉, 읽기모드이면서 텍스트 모드로 파일을 엽니다. 만약 mode에 'w'만 입력하면 'wt'모드로 파일을 엽니다.
f=open('file_name', 'w' f.write(str) f.close() |
open()에서 위와 같이 쓰기 모드('w')로 파일을 열면 지정된 이름으로 파일을 생성한 후에 파일을 엽니다. 혹시 같은 이름의 파일이 있다면 기존 파일의 내용을 모두 삭제하고 파일을 엽니다. 파일을 열 때 파일 객체인 f를 반환하는데, 이를 이용해 열린 파일을 구분합니다. write(str)에서 str은 문자열을 의미합니다. write()에서는 print()함수에서 사용하는 출력 방식을 그대로 이용할 수 있습니다. 즉, 따옴표를 이용해 문자열을 파일로 출력할 수도 있고 형식 지정 출력 방식을 이용해 문자열을 파일로 출력할 수도 있습니다. 마지막으로 파일에 원하는 내용을 다 썼다면 close()를 이용해 파일을 닫습니다. 파일이 닫히면 파일 객체인 f도 사라집니다.
이제 문자열을 파일에 쓰는 예를 살펴보겠습니다. 우선 앞에서 만든 'C:\myPyCode'폴더로 이동하겠습니다.
In : cd C:\myPyCode Out : C:\myPyCode |
다음으로 파일을 쓰기 모드로 연 후 문자열을 쓰고 파일을 닫는 코드를 작성하겠습니다.
In : f=open('myFile.txt','w') f.write('This is my first file.') f.close() |
위의 코드를 실행하면 문자열이 저장된 파일 하나가 만들어집니다. 윈도우 탐색기로 'C:\myPyCode'로 가서 'myFile.txt'파일이 있는지 없는지 확인할 수 있지만 이번 예제에서는 '!type 파일 이름'을 이용해 파일이 있는지 확인해 보겠습니다.
In : !type myFile.txt Out : This is my first file. |
파일 쓰기로 쓴 문자열이 파일 내용으로 출력됩니다. 이것으로 지정된 파일 이름으로 파일이 잘 만들어졌고 파일에 문자열 쓰기도 잘 수행됐음을 알 수 있습니다.
파일 읽기
파일을 읽으려면 우선 파일을 읽기 모드로 열어야 합니다. 그 후에 파일의 내용을 읽고 마지막으로 파일을 닫습니다.
다음은 파일을 읽기 모드이면서 텍스트 모드로 연 후에 파일 내용을 읽고 파일을 닫는 구조의 예입니다.
f=open('file_name','r') data=f.read() f.close() |
위와 같이 수행하면 read()로 읽은 파일의 내용은 모두 data 변수에 할당됩니다.
다음은 앞에서 생성한 'myFile.txt' 파일을 열고 파일 내의 문자열을 읽은 후에 파일을 닫는 예제입니다. 파일의 문자열을 잘 읽었는지 확인하기 위해 파일에서 읽은 데이터를 print() 함수로 화면에 출력했습니다.
In : f=open('myFile.txt','r') file_text=f.read() f.close() print(file_text) Out : This is my first file. |
반복문을 이용해 파일 읽고 쓰기
텍스트 파일의 데이터를 읽거나 데이터를 텍스트 파일로 쓸 때 반복문을 이용해 파일의 내용을 한 줄씩 처리해야 할 때가 많습니다. 이번에는 반복문을 사용해 파일을 읽고 쓰는 방법을 알아보겠습니다.
파일에 문자열 한 줄씩 쓰기
반복문을 이용해 파일을 읽고 쓰는 방법 중에서 우선 for 문을 이용해 문자열을 한 줄씩 파일에 쓰는 방법을 알아보겠습니다. 먼저 파일을 연 후에 for 문에서 지정된 범위만큼 반복해서 문자열을 한 줄씩 파일에 쓰고 마지막으로 파일을 닫겠습니다.
다음은 구구단 2단의 일부를 파일로 저장하는 코드입니다.
In : f=open('two_times_table.txt','w') for num in range(1,6): format_string="2x{0}={1}\n".format(num,2*num) f.write(format_string) f.close() |
예제에서는 open() 함수를 이용해 쓰기 모드로 파일을 연 후, for 문으로 반복할 범위를 지정하고 for문에서 <반복 범위>만큼 반복해서 파일에 쓰기를 수행한 후 파일을 닫습니다. write() 함수를 이용해 데이터를 파일로 쓸 때 print() 함수에서 사용한 출력 양식을 거의 그대로 이용할 수 있습니다. 단, write() 함수는 자동으로 줄 바꿈이 되지 않으므로 파일에서 줄을 바꾸기 위해서는 문자열 끝에 개행문자(\n)를 추가해야 합니다.
파일이 잘 생성됐는지 확인하기 위해 '!type 파일 이름'을 실행해 파일에 저장된 내용을 출력할 수 있습니다.
In : !type two_times_table.txt Out : 2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 |
파일에서 문자열 한 줄씩 읽기
이번에는 반복문을 이용해 파일 내용을 한 줄씩 읽는 방법을 알아보겠습니다. 지금까지는 'f=open('file_name')'으로 파일을 연 후 'f.read()'를 이용해 파일 내용을 읽었습니다. 이 방법은 파일 내용 전체를 반환하므로 내용을 한 줄씩 읽어서 처리해야 할 때 사용하기 어렵습니다. 파일 내용을 한 줄씩 읽고 처리하면 readline()나 readlines()를 이용합니다.
readline()
먼저 readline()을 이용하는 방법을 알아보겠습니다. 파일을 연 후 readline()을 수행하면 파일로부터 문자열 한 줄을 읽습니다. 다시 readline()을 사용하면 바로 그 다음 문자열 한 줄을 읽습니다. 이런 식으로 readline()은 실행한 횟수만큼 문자열을 한 줄씩 읽습니다. 만약 파일의 마지막 한 줄을 읽고 나서 다시 readline()을 수행하면 빈 문자열을 반환합니다.
다음은 readline(0을 이용해 파일에서 문자열을 한 줄 씩 읽어오는 예입니다. 앞에서 만든 파일 'two_times_table.txt'를 이용하겠습니다.
In : f=open("two_times_table.txt") |
위의 코드는 파일을 연 후 readline()을 이용해 문자열을 한 줄씩 두 번 읽고 print() 로 출력합니다. readline()으로 읽은 문자열에는 이미 개행문자(\n)가 포함됐으므로 print()에서는 줄 바꿈이 중복되지 않게 『end=""』처럼 end 인자를 빈 문자열("")로 설정했습니다. 출력 결과에서 readline()으로 한 줄씩 읽은 문자열이 잘 출력됐습니다.
앞의 설명에서 readline()은 파일의 맨 끝 줄을 읽고 난 후 다시 실행하면 빈 문자열을 반환한다고 했습니다. 이 특징을 이용해 다음과 같이 while 문과 readline()으로 파일 전체에서 문자열을 한 줄씩 읽어올 수 있습니다. 다음 코드에서 line에는 readline()의 수행 결과로 가져온 한 줄 문자열이 대입되고 'while line:'에서 line이 빈 문자열인지를 검사해서 빈 문자열이 아니면 while 문을 계속 수행하고 빈 문자열이면 while 문을 빠져나옵니다.
In : f= open("two_times_table.txt") line=f.readline() while line: print(line, end="") line=f.readline() f.close() Out : 2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 |
readlinse()
readline()은 파일에서 문자열을 한 줄씩 읽었지만 readlines()는 파일 전체의 모든 줄을 읽어서 한 줄씩을 요소로 갖는 리스트 타입으로 변환합니다.
다음은 readlines()를 이용해 파일의 전체 내용을 읽어오는 예입니다. 이번에도 앞에서 만든 파일 'two_times_table.txt'를 그대로 이용하겠습니다.
In : f=open("two_times_table.txt") |
위의 예는 지정된 파일을 열고, readline()를 이용해 파일의 전체 문자열을 읽어서 변수 lines에 할당한 후 파일을 닫는 코드입니다. 변수 lines의 출력 결과에서 readlines()의 반환 값이 리스트인 것을 확인할 수 있습니다. 리스트 항목에는 파일에서 한 줄씩 읽은 문자열이 들어가 있는데, 여기에는 개행문자(\n)도 포함돼 있습니다.
lines 리스트에 할당된 문자열은 다음 코드처럼 for 문을 이용해 항목을 하나씩 처리할 수 있습니다.
In : f=open("two_times_table.txt") lines=f.readlines() f.close() for line in lines: print(line, end="") Out : 2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 |
위의 코드에서 for 문의 <반복 범위>에 lines 변수 대신 바로 f.readlines()를 쓰면 다음처럼 코드가 더 간단해집니다.
In : f=open("two_times_table.txt") for line in f.readlines(): print(line, end="") f.close() Out : 2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 |
위의 코드에서 for 문의 <반복 범위>에 있는 f.readlines() 대신 f만 입력해도 됩니다. 즉, for 문의 <반복 범위>에 파일 객체만 써도 '파일객체.readlines()'를 쓴 것과 같습니다. 따라서 위의 코드는 다음과 같이 좀 더 간단하게 작성할 수 있습니다.
In : f=open("two_times_table.txt") for line in f: print(line, end="") f.close() Out : 2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 |
with 문을 활용해 파일 읽고 쓰기
with 문의 구조
앞에서 파일을 읽고 쓰려면 다음과 같은 과정을 거쳐야 했습니다.
1. 파일 열기
2. 파일 일고/쓰기
3. 파일 닫기
예를 들어, 텍스트 파일에 쓰는 코드는 다음과 같습니다.
In : f=open('myTextFile.txt', 'w') f.write('File write/read test.') f.close() |
또한 텍스트 파일을 읽는 코드는 다음과 같습니다.
In : f=open('myTextFile.txt','r') test=f.read() f.close() print(test) Out : File write/read test. |
지금까지 이용한 방법은 open() 함수를 이용해 파일을 연 후에는 읽기나 쓰기가 끝난 후 close()로 파일을 닫았습니다. 하지만 with 문을 이용한다면 수행이 끝난 후에 자동으로 파일을 닫기 때문에 close()를 수행하지 않아도 됩니다.
with 문을 이용해 파일 열기를 할 경우 다음과 같은 코드 구조를 이용합니다.
with open('file_name', 'mode') as f: <코드 블록> |
여기서 open() 함수의 입력 인자는 앞에서 살펴본 것과 같습니다. 즉, file_name은 파일 이름이고, mode는 파일의 속성 지정을 위한 옵션입니다. 또한 f는 open() 함수의 반환 결과인 파일 객체로 <코드 블록>에서 파일을 읽거나 쓸 때 이용합니다. <코드 블록>의 코드가 모두 끝나면 open()으로 열린 파일 객체는 자동으로 닫힙니다.
예를 들어, 텍스트 파일 쓰기를 위해서는 다음과 같이 작성합니다.
with open('file)name','w')as f: f.write(str) |
또한 텍스트파일을 읽으려면 다음과 같이 작성합니다.
with open('file_name', 'r') as f: data=f.read() |
여기서 읽기 모드를 표시한 'r'은 써도 되고, 안 써도 됩니다.
with 문의 활용
다음은 with 문을 이용해 파일에 문자열을 쓰는 예입니다.
In : with open('C:\mypyCode\myTextFile2.txt', 'w') as f: f.write('File read/write test2: line1\n') f.write('File read/write test2: line2\n') f.write('File read/write test2: line3\n') |
위 코드의 실행으로 'C:\myPyCode'폴더에 'myTextFile2.txt'파일을 생성해서 문자열을 썼습니다. 위와 같이 파일명뿐만 아니라 폴더의 위치까지 포함해서 파일명을 쓰는 경우 코드의 실행 위치와 상관없이 파일을 열 수 있어서 유용할 때가 있ㅅ브니다. 참고로 윈도우 명령어에서는 경로 구문을 위해 \을 이용하지만 파이썬에서는 \ 대신 /를 사용해도 됩니다. 다음은 with 문을 이용해 이렇게 생성한 파일을 읽는 예입니다.
In : with open('C:\mypyCode\myTextFile2.txt') as f: |
with 문을 반복문과 함께 이용하면 한 줄씩 문자열을 읽고 쓸 수 있습니다. 다음은 구구단 3단의 일부가 저장된 텍스트 파일인 'myTextFile3.txt'를 만들기 위해 with 문에 for 문을 적용해 <반복 범위>만큼 문자열을 생성하고 파일에 쓰는 코드입니다.
In : with open('C:\mypyCode\myTextFile3.txt', 'w') as f: for num in range(1,6): format_string="3x{0}-{1}\n".format(num,3*num) f.write(format_string) |
다음으로 with 문과 for 문을 이용해 앞에서 만든 파일 'myTextFile3.txt'의 문자열을 한 줄씩 읽어서 출력하는 코드를 작성하겠습니다. 여기서 for 문의 <반복 범위>에는 f.readline() 대신 f만 입력하겠습니다.
In : with open('C:\mypyCode\myTextFile3.txt', 'r') as f: for line in f: print(line, end="") Out : 3x1=3 3x2=6 3x3=9 3x4=12 3x5=15 |
출처 : 데이터분석을 위한 파이썬 철저 입문 中