https://docs.python.org/ko/3/tutorial/inputoutput.html
python tutorial part 7
입력과 출력
7.1. 출력 포매팅 出力を見やすくフォーマットする
입력 방법 2가지
- 표현식 문장
- print() 함수
(세 번째 방법 : 파일 객체의 write() 메소드; 표준 출력 파일은 sys.stdout 참조)
これまでに、値を出力する二つの方法: 式文 (expression statement) と print() 関数が出てきました。
(第三はファイルオブジェクトの write() メソッドを使う方法です。標準出力を表すファイルは sys.stdout で参照できます。詳細はライブラリリファレンスを参照してください。)
출력 포맷
문자열 리터럴 포맷
문자열 앞 f 또는 F
문자열 안 { 변수 / 리터럴 값 } 참조
フォーマット済み文字列リテラル を使うには、開き引用符や三重の開き引用符の前に fあるいは F を付けて文字列を始めます。 この文字列の内側では、文字 { と文字 } の間に Python の式が書け、その式から変数やリテラル値が参照できます。
문자열 str.format()
'{변수1 포멧} str {변수 2 포멧}'.format(변수1, 변수2}
자세한 포멧 형식 제공 (ex :2.2% => 문자열 슬라이싱 2 .소수점 2자리 %
포맷 정보 제공 (변수명 입력)
文字列の str.format() メソッドは、もう少し手間がかかります。
ここでも { と } を使って変数に代入する場所の印を付けて、
細かいフォーマットの指示を出せますが、
フォーマットされる対象の情報を与える必要があります。
문자열 슬라이싱 및 이어붙이기 연산
最後に、文字列のスライス操作や結合操作を使い、全ての文字列を自分で処理し、
思い通りのレイアウトを作成できます。
문자열형에는 주어진 열 너비로 문자열을 채우는 데 유용한 연산을 수행하는 몇 가지 메서드가 있습니다.
文字列型には、文字列の間隔を調整して指定されたカラム幅に揃えるのに便利な操作を行うメソッドがいくつかあります。
str() repr()
- 변수의 모든 값을 문자열로 변환
- 디버깅을 위해
凝った出力である必要は無いけれど、デバッグ目的で変数をすばやく表示したいときは、
repr() 関数か str() 関数でどんな値も文字列に変換できます。
str() :
어느 정도 사람이 읽기에 적합한 형태로 출력
repr() :
인터프리터에 의해 읽힐 수 있는 형태 (표현할 만한 문법이 없다면 SyntaxError 발생).
사람 위한 없는 객체의 경우, str() 는 repr() 과 같은 값 출력
- 많은 값, 숫자들이나 리스트와 딕셔너리와 같은 구조
str() 関数は値の人間に読める表現を返すためのもので、
repr() 関数はインタープリタに読める (あるいは同値となる構文がない場合は必ず SyntaxError になるような) 表現を返すためのものです。
人間が読むのに適した特定の表現を持たないオブジェクトにおいては、str() は repr() と同じ値を返します。
数値や、リストや辞書を始めとするデータ構造など、多くの値がどちらの関数に対しても同じ表現を返します。
문자열은 두 가지 표현
一方、文字列は、2つの異なる表現を持っています。
ex)
string 모듈 - Template 클래스
문자열 값 치환하는 방법
$x와 같은 자리 표시자를 사용하고 이것들을 딕셔너리에서 오는 값으로 치환
포매팅에 대한 제어를 훨씬 덜 제공합니다.
string モジュールの Template クラスも、
文字列中の値を置換する別の方法を提供しています。
$x のようなプレースホルダーを使い、その箇所と辞書にある値を置き換えますが、
使えるフォーマット方式はとても少ないです。
7.1.1. 포맷 문자열 리터럴 フォーマット済み文字列リテラル
포맷 문자열 리터럴( f-문자열)
문자열에 f 또는 F 접두어를 붙이고 표현식을 {expression}로 작성
하여 문자열에 파이썬 표현식의 값을 삽입할 수 있게 합니다.
フォーマット済み文字リテラル (短くして f-string とも呼びます) では、
文字列の頭に f か Fを付け、式を {expression} と書くことで、 Python の式の値を文字列の中に入れ込めます。
표현식 뒤에 선택적인 포맷 지정자가 올 수 있습니다.
オプションのフォーマット指定子を式の後ろに付けられます。
このフォーマット指定子によって値のフォーマット方式を制御できます。
ex)
원주율을 소수점 이하 세 자리로 반올림
円周率πを小数点以下3桁に丸めてフォーマット
':' 뒤에 정수
필드 문자 폭 - 열 줄 맞춤 때 편리
':' の後ろに整数をつけると、
そのフィールドの最小の文字幅を指定できます。 この機能は縦を揃えるのに便利です。
수정자
포맷 전에 값을 변환
'!a' : ascii()
'!s' : str()
'!r' : repr()
他の修飾子は、フォーマットする前に値を変換するのに使えます。
'!a' は ascii() を、 '!s'は str() を、 '!r' は repr() を適用します:
포맷 사양 레퍼런스 - 포맷 명세 미니 언어 레퍼런스 지침서 참조
これらのフォーマット仕様の参考資料として、 書式指定ミニ言語仕様 のガイドを参照してください。
7.1.2. 문자열 format() 文字列の format() メソッド
str.format()
{문자} : 포맷 필드. str.format(객체)로 치환
括弧とその中の文字(これをフォーマットフィールドと呼びます)は、 str.format() メソッドに渡されたオブジェクトに置換されます。
{숫자} : 숫자는 치환될 객체들의 위치
括弧の中の数字は str.format() メソッドに渡されたオブジェクトの位置を表すのに使えます。
키워드 인자 - key를 사용해서 값 지정
str.format() メソッドにキーワード引数が渡された場合、その値はキーワード引数の名前によって参照されます。
위치와 키워드 인자를 자유롭게 조합할 수 있습니다:
順序引数とキーワード引数を組み合わせて使うこともできます:
딕셔너리
'{[키1]}.... {[키2]}...{[키3]}'.fomat(dicName)
もしも長い書式文字列があり、それを分割したくない場合には、変数を引数の位置ではなく変数の名前で参照できるとよいでしょう。
これは、辞書を引数に渡して、角括弧 '[]' を使って辞書のキーを参照することで可能です
'**' 사용
'{키1}.... {키2}...{키3}'.fomat(**dicName)
table を '**' 記法を使ってキーワード引数として渡す方法もあります。
vars()
모든 지역 변수를 담은 딕셔너리 반환.
全てのローカルな変数が入った辞書を返す組み込み関数 vars() と組み合わせると特に便利です。
ex)
정수와 그 제곱과 세제곱 - 정렬된 열 집합을 생성
与えられた整数とその 2 乗と 3 乗がきちんと揃った列を生成します:
문자열 포맷팅
https://docs.python.org/ko/3/library/string.html#formatstrings
7.1.3. 수동 문자열 포매팅 文字列の手作業でのフォーマット
제곱수와 세제곱수 표
次は 2 乗と 3 乗の値からなる同じ表を手作業でフォーマットしたものです:
폭에 맞게 문자열 정렬
str.rjust() : 오른쪽
str.ljust() : 왼쪽
str.center() : 가운데
출력 x - 새 문자열을 반환
문자열이 너무 길면 그냥 돌려줍니다;
(잘라내기를 원한다면, 슬라이스 연산을 추가, x.ljust(n)[:n].)
文字列オブジェクトの str.rjust() メソッドは、指定された幅のフィールド内に文字列が右寄せで入るように左側に空白を追加します。
同様のメソッドとして、 str.ljust() と str.center() があります
これらのメソッドは何か出力を行うわけではなく、ただ新しい文字列を返します。
入力文字列が長すぎる場合、文字列を切り詰めることはせず、値をそのまま返します。
この仕様のためにカラムのレイアウトが滅茶苦茶になるかもしれませんが、嘘の値が代わりに書き出されるよりはましです。
(本当に切り詰めを行いたいのなら、全てのカラムに x.ljust(n)[:n] のようにスライス表記を加えることもできます。)
(print() - 항상 인자들 사이에 스페이스를 추가)
(各カラムの間のスペース一個分は print() の動作で追加されていることに注意してください。 print() は常に引数間に空白を追加します。)
str.zfill(자리수)
자리수에 맞게 빈칸에 문자열(숫자) 왼쪽으로 0을 채웁니다.
자리수에 ., -, + 부호 포함
もう一つのメソッド、 str.zfill() は、数値文字列の左側をゼロ詰めします。
7.1.4. 예전의 문자열 포매팅 古い文字列書式設定方法
% 연산자
왼쪽 인자를 오른쪽 인자에 적용되는 sprintf()-스타일 포맷 문자열로 해석
これは、演算子の左側の sprintf()スタイルのフォーマット文字列に、演算子の右側の値を適用し、その結果の文字列を返します。
참조 :
https://docs.python.org/ko/3/library/stdtypes.html#old-string-formatting
7.2. 파일을 읽고 쓰기 ファイルを読み書きする
open() 은
파일 객체 반환
.open(filename, mode).
open() は file object を返します。
open(filename, mode) のように二つの引数を伴って呼び出されます。
첫 번째 인자 : filename 파일 이름
두 번째 인자 : mode.
mode
'r' : 읽기전용 (생략시 기본값)
'w' : 쓰기전용 (이미 존재하는 파일은 삭제) 가 되고,
'a' : 파일 덧붙이기 : 파일에 기록되는 모든 데이터는 자동으로 끝에 붙습니다.
'r+' : 파일 읽고 쓰기
最初の引数はファイル名の入った文字列です。
二つめの引数も文字列で、ファイルをどのように使うかを示す数個の文字が入っています。
mode は、
ファイルが読み出し専用なら 'r' 、
書き込み専用 (同名の既存のファイルがあれば消去されます) なら 'w' とします。
'a' はファイルを追記用に開きます。ファイルに書き込まれた内容は自動的にファイルの終端に追加されます。
'r+' はファイルを読み書き両用に開きます。
mode 引数は省略可能で、省略された場合には 'r' であると仮定します。
보통,
텍스트 모드 (text mode)
파일에 문자열을 읽고 쓰고, 특정 인코딩으로 저장
인코딩이 지정되지 않으면 기본값( 플랫폼 의존적)
'b' : 바이너리 모드 (binary mode)
바이트열 객체의 형태 - 텍스트를 포함하지 않는 모든 파일
通常、ファイルはテキストモード (text mode) で開かれ、特定のエンコーディングでエンコードされたファイルに対して文字列を読み書きします。
エンコーディングが指定されなければ、デフォルトはプラットフォーム依存です (open() を参照してください) 。
モードに 'b' をつけるとファイルをバイナリモード (binary mode) で開き、
byte オブジェクトを読み書きします。テキストファイル以外のすべてのファイルはバイナリモードを利用するべきです。
텍스트 모드
읽을 때의 기본 동작은 플랫폼 의존적인 줄 종료 (유닉스에서 \n, 윈도우에서 \r\n) 를 단지 \n 로 변경하는 것
쓸 때, 기본 동작은 \n 를 다시 플랫폼 의존적인 줄 종료로 변환하는 것입니다.
이 파일 데이터에 대한 무대 뒤의 수정은 텍스트 파일의 경우는 문제가 안 되지만, JPEG 이나 EXE 파일과 같은 바이너리 데이터를 망치게 됩니다.
그런 파일을 읽고 쓸 때 바이너리 모드를 사용하도록 주의하세요.
テキストモードの読み取りでは、プラットフォーム固有の行末記号 (Unix では \n 、Windows では \r\n) をただの \n に変換するのがデフォルトの動作です。
テキストモードの書き込みでは、 \n が出てくる箇所をプラットフォーム固有の行末記号に戻すのがデフォルトの動作です。
この裏で行われるファイルデータの変換はテキストファイルには上手く働きますが、
JPEG ファイルや EXE ファイルのようなバイナリデータを破壊する恐れがあります。
そのようなファイルを読み書きする場合には注意して、バイナリモードを使うようにしてください。
with 키워드
예외가 발생하더라도 종료될 때 파일이 올바르게 닫힌다는 것
with는 try-finally 비해 훨씬 짧음
ファイルオブジェクトを扱うときに with キーワードを使うのは良い習慣です。
その利点は、処理中に例外が発生しても必ず最後にファイルをちゃんと閉じることです。
with を使うと、同じことを try-finally ブロックを使って書くよりずっと簡潔に書けます:
with 키워드를 사용하지 않으면, f.close() 를 호출
파일을 닫고 사용된 시스템 자원 반납
명시적으로 파일을 닫지 않으면,
파이썬 가비지 콜렉터가 강제로 객체를 제거하고 파일을 닫음
- 파일이 한동안 열린 상태로 남음
- 다른 구현의 뒷정리를 다른 시점에서 수행
with キーワードを使わない場合は、f.close() を呼び出してファイルを閉じ、
そのファイルが使っていたシステムリソースをすぐに解放する必要があります。
明示的にファイルを閉じなかった場合は、
いつかは Python のガベージコレクタがそのファイルオブジェクトを破棄し開かれいていたファイルを閉じますが、
しばらくはファイルが開かれたままでいる可能性があります。
他に考えられるリスクは、別の Python の実装ではこの片付け処理が別のタイミングで実行されることです。
파일 이 닫힌 후, with 문이나 f.close() 를 호출하는 경우 - 자동으로 실패
with 文や f.close() の呼び出しによって閉じられた後にファイルオブジェクトを使おうとするとそこで処理が失敗します。:
7.2.1. 파일 객체의 매소드 ファイルオブジェクトのメソッド
ex
파일 객체 f
この節の以降の例は、 f というファイルオブジェクトが既に生成されているものと仮定します。
f.read(size)
size만큼 읽고 문자열(텍스트 모드) 이나 바이트열(바이너리 모드) 반환.
ファイルの内容を読み出すには、 f.read(size) を呼び出します。
このメソッドはある量のデータを読み出して、文字列 (テキストモードの場合) か bytes オブジェクト (バイナリーモードの場合) として返します。
size
선택적인 숫자 인자.
생략/ 음수 - 전체 읽음
파일이 메모리보다 두 배 크면 여러분이 감당할 문제
그렇지 않으면 최대 size 바이트를 읽고 돌려줍니다.
파일의 끝에 도달하면, f.read()
는 빈 문자열(''
) 을 돌려줍니다.
size はオプションの数値引数です。
size が省略されたり負の数であった場合、ファイルの内容全てを読み出して返します。
ただし、ファイルがマシンのメモリの二倍の大きさもある場合にはどうなるかわかりません。
size が負でない数ならば、最大で size バイトを読み出して返します。
ファイルの終端にすでに達していた場合、 f.read() は空の文字列 ('') を返します。
f
.readline()
: 파일을 한 줄 씩을 읽습니다; f.readline() はファイルから 1 行だけを読み取ります。
\n(개행 문자) : 문자열의 끝에 보존
파일이 개행문자로 끝나지 않는 때에만 파일의 마지막 줄에서만 생략
改行文字 (\n) は読み出された文字列の終端に残ります。
改行が省略されるのは、ファイルが改行で終わっていない場合の最終行のみです。
파일의 끝 : 빈 문자열
빈 줄 : '\n', 개행문자 문자열
これは、戻り値があいまいでないようにするためです;
f.readline() が空の文字列を返したら、ファイルの終端に達したことが分かります。
一方、空行は '\n'、すなわち改行 1 文字だけからなる文字列で表現されます。
파일 객체 루핑
한 줄 씩 출력. 메모리 효율적, 빠르며 간단한 코드
ファイルから複数行を読み取るには、ファイルオブジェクトに対してループを書く方法があります。
この方法はメモリを効率的に使え、高速で、簡潔なコードになります:
list(f) , f.readlines()
파일의 모든 줄을 리스트로 읽음
ファイルのすべての行をリスト形式で読み取りたいなら、list(f) や f.readlines() を使うこともできます。
f.write(string)
string 의 내용을 파일에 쓰고, 출력된 문자들의 개수를 돌려줍니다.
f.write(string) は、string の内容をファイルに書き込み、書き込まれた文字数を返します。
형 변환 (tuple -> string)
f.tell()
파일에서 현재 위치를 정수로 반환
바이너리 모드 : 파일의 처음에서 현 위치까지 바이트 수로 표현
텍스트 모드 : 불투명한 숫자
f.tell() は、ファイルオブジェクトのファイル中における現在の位置を示す整数を返します。
ファイル中の現在の位置は、
バイナリモードではファイルの先頭からのバイト数で、
テキストモードでは不明瞭な値で表されます。
f.seek(offset, from_what)
파일 객체의 위치를 바꿈
위치는 기준점(from_what)에 offset 을 더해서 계산
ファイルオブジェクトの位置を変更するには、f.seek(offset, from_what) を使います。
ファイル位置は基準点 (reference point) にオフセット値 offset を足して計算されます。
from_what
생략, 0 : 파일의 처음
1 : 현재 파일 위치
2 : 파일의 끝을 기준점
参照点は from_what 引数で選びます。
from_what の値が 0 ならばファイルの 先頭から測り、
1 ならば現在のファイル位置を使い、
2 ならばファイルの終端を参照点として使います。
from_what は省略することができ、デフォルトの値は 0、すなわち参照点としてファイルの先頭を使います。
텍스트 파일 - 파일의 시작에서 상대적인 위치 변경만 허락
예외 : seek(0, 2) 를 사용해서 파일의 끝으로 위치를 변경하는 경우
올바른 offset 값 : f.tell(), 0
그 밖의 다른 offset 값 : 정의되지 않은 결과
テキストファイル (mode 文字列に b を付けなかった場合) では、
ファイルの先頭からの相対位置に対するシークだけが許可されています (例外として、seek(0, 2) でファイルの末尾へのシークは可能です)。
また、唯一の有効な offset 値は f.tell() から返された値か、0 のいずれかです。
それ以外の offset 値は未定義の振る舞いを引き起こします。
7.2.2. json - 구조적인 데이터를 저장하기 json による構造化されたデータの保存
'문자열'은 파일에 읽고 쓰기 쉬움.
'숫자' - > 약간의 수고 필요
read() - 문자열만 반환하기 때문
이 문자열을 int() 숫자로 형변환 필요.
'중첩 리스트'나 '딕셔너리' - 수작업으로 파싱하고 직렬화하는 것이 더 까다로움
文字列は簡単にファイルに書き込んだり、ファイルから読み込んだりすることができます。
数値の場合には少し努力が必要です。
というのも、read() メソッドは文字列しか返さないため、int() のような関数にその文字列を渡して、たとえば文字列 '123' のような文字列を、数値 123 に変換しなくてはならないからです。
もっと複雑なデータ型、例えば入れ子になったリストや辞書の場合、手作業でのパースやシリアライズは困難になります。
파이썬은 JSON (JavaScript Object Notation)의 데이터 교환 형식 지원
ユーザが毎回コードを書いたりデバッグしたりして複雑なデータ型をファイルに保存するかわりに、Python では一般的なデータ交換形式である JSON (JavaScript Object Notation) を使うことができます。
json :
표준 모듈은 파이썬 데이터 계층을 받아서 문자열 표현으로 바꿔줍니다 : 직렬화 (serializing)
역 직렬화 (deserializing) : 문자열 표현으로부터 데이터를 재구성
직렬화와 역 직렬화 사이에서, 객체 문자열은 파일이나 데이터에 저장, 네트워크 연결을 통해 원격 기계로 전송될 수 있음
この標準モジュール json は、Python のデータ 階層を取り、文字列表現に変換します。この処理は シリアライズ (serializing) と呼ばれます。
文字列表現からデータを再構築することは、デシリアライズ (deserializing) と呼ばれます。
シリアライズされてからデシリアライズされるまでの間に、オブジェクトの文字列表現はファイルやデータの形で保存したり、ネットワークを通じて離れたマシンに送ったりすることができます。
JSON 형식은 데이터 교환을 위해 현대 응용 프로그램들이 자주 사용합니다.
많은 프로그래머가 이미 이것에 익숙하므로, 연동성을 위한 좋은 선택이 됩니다.
JSON 形式は現代的なアプリケーションでデータをやりとりする際によく使われます。
多くのプログラマーが既に JSON に詳しいため、JSON はデータの相互交換をする場合の良い選択肢です。
.dump()
dumps() 함수의 변종
객체를 텍스트 파일로 직렬화
f 가 쓰기를 위해 열린 텍스트 파일 이면, 이렇게 할 수 있습니다:
dumps() に似た関数に、dump() があり、こちらは単純にオブジェクトを text file にシリアライズします。
f が書き込み用に開かれた text file だとすると、次のように書くことができます:
.load(파일)
텍스트 파일 f 역 질렬화하기 :
逆にデシリアライズするには、f が読み込み用に開かれた text file だとすると、次のようになります:
더 보기
pickle - 피클 모듈
JSON 에 반해, pickle 은 임의의 복잡한 파이썬 객체들을 직렬화할 수 있는 프로토콜입니다. 파이썬에 국한되고 다른 언어로 작성된 응용 프로그램들과 통신하는데 사용될 수 없습니다. 기본적으로 안전하지 않기도 합니다: 믿을 수 없는 소스에서 온 데이터를 역 직렬화할 때, 숙련된 공격자에 의해 데이터가 조작되었다면 임의의 코드가 실행될 수 있습니다.
pickle - pickle モジュール
JSON とは対照的に、 pickle は任意の複雑な Python オブジェクトをシリアライズ可能なプロトコルです。しかし、Python に特有のプロトコルで、他の言語で記述されたアプリケーションと通信するのには使えません。さらに、デフォルトでは安全でなく、信頼できない送信元から送られてきた、スキルのある攻撃者によって生成された pickle データをデシリアライズすると、攻撃者により任意のコードが実行されてしまいます。
'공부하기 > Python3 튜토리얼 정리' 카테고리의 다른 글
python tutorial -9 클래스 (0) | 2019.06.16 |
---|---|
python tutorial -8 에러 / 예외 (0) | 2019.06.15 |
python tutorial -6 모듈 (0) | 2019.06.14 |
python tutorial -5 자료 구조 (0) | 2019.06.14 |
python tutorial -4 제어 흐름 도구 (0) | 2019.06.13 |