본문 바로가기

python tutorial -7 입출력

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 けて文字列めますこの文字列内側では文字 { 文字 } Python そのから変数やリテラル参照できます

 

>  >>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
'Results of the 2016 Referendum'




문자열 str.format() 


'{변수1 포멧} str {변수 2 포멧}'.format(변수1, 변수2}

자세한 포멧 형식 제공 (ex :2.2% => 문자열 슬라이싱 2 .소수점 2자리 %

포맷 정보 제공 (변수명 입력)

 

文字列str.format() メソッドはもう手間がかかります。 

ここでも { } 使って変数代入する場所けて

かいフォーマットの指示せますが

フォーマットされる対象情報える必要があります


> >>> yes_votes = 42_572_654 >>> no_votes = 43_132_495 >>> percentage = yes_votes / (yes_votes + no_votes)

>>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage) ' 42572654 YES votes 49.67%'



문자열 슬라이싱 및 이어붙이기 연산

最後文字列のスライス操作結合操作使ての文字列自分処理

りのレイアウトを作成できます。 


문자열형에는 주어진 열 너비로 문자열을 채우는 데 유용한 연산을 수행하는 몇 가지 메서드가 있습니다.

文字列型には文字列間隔調整して指定されたカラムえるのに便利操作うメソッドがいくつかあります

 


 

str() repr()


- 변수의 모든 값을 문자열로 변환

- 디버깅을 위해


った出力である必要いけれどデバッグ目的変数をすばやく表示したいときは、 

repr() 関数str() 関数でどんな文字列変換できます

 

 

str() : 

어느 정도 사람이 읽기에 적합한 형태로 출력


repr() : 

인터프리터에 의해 읽힐 수 있는 형태 (표현할 만한 문법이 없다면  SyntaxError 발생). 


사람 위한 없는 객체의 경우, str() repr() 과 같은 값 출력

- 많은 값, 숫자들이나 리스트와 딕셔너리와 같은 구조


str() 関数人間める表現すためのもので

repr() 関数はインタープリタにめる (あるいは同値となる構文がない場合SyntaxError になるような) 表現すためのものです

人間むのにした特定表現たないオブジェクトにおいてはstr() repr() します

数値リストや辞書めとするデータ構造などくのがどちらの関数しても表現します

 

 

문자열은 두 가지 표현

一方文字列2つのなる表現っています

 

ex)

>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # The argument to repr() may be any Python object:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"



string 모듈 - Template 클래스

 문자열 값 치환하는 방법

$x와 같은 자리 표시자를 사용하고 이것들을 딕셔너리에서 오는 값으로 치환 

포매팅에 대한 제어를 훨씬 덜 제공합니다.


string モジュールの Template クラスも

文字列中置換する方法提供しています。 

$x のようなプレースホルダーを使その箇所辞書にあるえますが

使えるフォーマット方式はとてもないです

 




7.1.1. 포맷 문자열 리터럴 フォーマット文字列リテラル


포맷 문자열 리터럴( f-문자열)


문자열에 f 또는 F 접두어를 붙이고 표현식을 {expression}로 작성

하여 문자열에 파이썬 표현식의 값을 삽입할 수 있게 합니다.

 

     フォーマット文字リテラル (くして f-string ともびます) では

文字列f F{expression} くことでPython 文字列めます

 

 

표현식 뒤에 선택적인 포맷 지정자가 올 수 있습니다

  

オプションのフォーマット指定子ろにけられます。 

このフォーマット指定子によってのフォーマット方式制御できます。 

 


ex)

원주율을 소수점 이하 세 자리로 반올림

円周率π小数点以下3めてフォーマット

>>> import math
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
The value of pi is approximately 3.142.



':' 뒤에 정수


필드 문자 폭 - 열 줄 맞춤 때 편리

 

':' ろに整数をつけると

そのフィールドの最小文字幅指定できますこの機能えるのに便利です

 

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
...     print(f'{name:10} ==> {phone:10d}')
...
Sjoerd     ==>       4127
Jack       ==>       4098
Dcab       ==>       7678



수정자

포맷 전에 값을 변환

'!a' : ascii()

'!s' : str()

'!r' : repr()

  

修飾子フォーマットする変換するのに使えます

'!a' ascii() '!s'str() '!r' repr() 適用します:

 

>>> animals = 'eels'
>>> print(f'My hovercraft is full of {animals}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.



포맷 사양 레퍼런스 - 포맷 명세 미니 언어 레퍼런스 지침서 참조

これらのフォーマット仕様参考資料として書式指定ミニ言語仕様 のガイドを参照してください

 

 

 


7.1.2. 문자열 format() 文字列format() メソッド


str.format()

 

{문자} : 포맷 필드str.format(객체)로 치환

括弧とその文字(これをフォーマットフィールドとびます)、 str.format() メソッドにされたオブジェクトに置換されます

>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"




{숫자} : 숫자는 치환될 객체들의 위치

括弧数字str.format() メソッドにされたオブジェクトの位置すのに使えます

>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam




키워드 인자 - key를 사용해서 값 지정

str.format() メソッドにキーワード引数された場合そのはキーワード引数名前によって参照されます

 

>>> print('This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.



위치와 키워드 인자를 자유롭게 조합할 수 있습니다: 

順序引数とキーワード引数わせて使うこともできます:

 

>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg'))
The story of Bill, Manfred, and Georg.




딕셔너리 

'{[키1]}.... {[키2]}...{[키3]}'.fomat(dicName)

 

もしも書式文字列がありそれを分割したくない場合には変数引数位置ではなく変数名前参照できるとよいでしょう

これは辞書引数して角括弧 '[]' 使って辞書のキーを参照することで可能です

 

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
...       'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678



'**'  사용

'{키1}.... {키2}...{키3}'.fomat(**dicName)

table '**' 記法使ってキーワード引数として方法もあります

 

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678



vars() 

모든 지역 변수를 담은 딕셔너리 반환.

 

てのローカルな変数った辞書関数 vars() わせると便利です

 



ex)

정수와 그 제곱과 세제곱 - 정렬된 열 집합을 생성

えられた整数とその 2 3 がきちんとった生成します:

 

>>> for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000




문자열 포맷팅

 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] のようにスライス表記えることもできます)


>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # Note use of 'end' on previous line
...     print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000


(print() - 항상 인자들 사이에 스페이스를 추가)

(カラムののスペース一個分print() 動作追加されていることに注意してくださいprint() 引数間空白追加します)

 



str.zfill(자리수)

자리수에 맞게 빈칸에 문자열(숫자) 왼쪽으로 0을 채웁니다

자리수에 ., -, + 부호 포함


もうつのメソッドstr.zfill() 数値文字列左側をゼロめします

 

>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'




7.1.4. 예전의 문자열 포매팅 文字列書式設定方法


% 연산자

 

왼쪽 인자를 오른쪽 인자에 적용되는 sprintf()-스타일 포맷 문자열로 해석 

これは演算子左側sprintf()スタイルのフォーマット文字列演算子右側適用その結果文字列します

 

>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.


참조 :

https://docs.python.org/ko/3/library/stdtypes.html#old-string-formatting

 

 


7.2. 파일을 읽고 쓰기 ファイルをきする


open() 은 

파일 객체 반환

.open(filename, mode).

 

open() file object します

open(filename, mode) のようにつの引数ってされます

 

>>> f = open('workfile', 'w')


첫 번째 인자 : 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 open('workfile') as f:
...     read_data = f.read()
>>> f.closed
True



with 키워드를 사용하지 않으면,  f.close() 를 호출

파일을 닫고 사용된 시스템 자원 반납


명시적으로 파일을 닫지 않으면

파이썬 가비지 콜렉터가 강제로 객체를 제거하고 파일을 닫음

- 파일이 한동안 열린 상태로 남음

- 다른 구현의 뒷정리를 다른 시점에서 수행

 

with キーワードを使わない場合f.close() してファイルを

そのファイルが使っていたシステムリソースをすぐに解放する必要があります。 


明示的にファイルをじなかった場合

いつかは Python のガベージコレクタがそのファイルオブジェクトを破棄かれいていたファイルをじますが

しばらくはファイルがかれたままでいる可能性があります

えられるリスクはPython 実装ではこの片付処理のタイミングで実行されることです

 

 

 

파일 이 닫힌 후, with 문이나 f.close() 를 호출하는 경우 - 자동으로 실패

with f.close() しによってじられたにファイルオブジェクトを使おうとするとそこで処理失敗します:


>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.




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.read()
'This is the entire file.\n'
>>> f.read()
''

 

   f.readline() : 파일을 한 줄 씩을 읽습니다

f.readline() はファイルから だけをります


\n(개행 문자) : 문자열의 끝에 보존

파일이 개행문자로 끝나지 않는 때에만 파일의 마지막 줄에서만 생략


改行文字 (\n) された文字列終端ります

改行省略されるのはファイルが改行わっていない場合最終行のみです

 

 

파일의 끝 : 빈 문자열

빈 줄 :  '\n', 개행문자 문자열

 

これはがあいまいでないようにするためです

f.readline() 文字列したらファイルの終端したことがかります

一方空行'\n'すなわち改行 1 文字だけからなる文字列表現されます


>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''




파일 객체 루핑

한 줄 씩 출력. 메모리 효율적, 빠르며 간단한 코드

 

ファイルから複数行るにはファイルオブジェクトにしてループを方法があります

この方法はメモリを効率的使高速簡潔なコードになります:

 

>>> for line in f:
...     print(line, end='')
...
This is the first line of the file.
Second line of the file



list(f) , f.readlines()

파일의 모든 줄을 리스트로 읽음

ファイルのすべてのをリスト形式りたいならlist(f) や f.readlines() 使うこともできます



f.write(string) 

string 의 내용을 파일에 쓰고, 출력된 문자들의 개수를 돌려줍니다.

f.write(string) string 内容をファイルにまれた文字数します


>>> f.write('This is a test\n')
15



형 변환 (tuple -> string)

 

>>> value = ('the answer', 42)
>>> s = str(value)  # convert the tuple to string
>>> f.write(s)
18




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すなわち参照点としてファイルの先頭使います

 

 

 

>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)      # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'



 텍스트 파일 파일의 시작에서 상대적인 위치 변경만 허락 

예외 : 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 はデータの相互交換をする場合選択肢です


 

>>> import json
>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'


.dump()

dumps() 함수의 변종

객체를 텍스트 파일로 직렬화

f 가 쓰기를 위해 열린 텍스트 파일 이면, 이렇게 할 수 있습니다:


dumps() 関数dump() がありこちらは単純にオブジェクトを text file にシリアライズします

f かれた text file だとするとのようにくことができます:

 

json.dump(x, f)


.load(파일)

텍스트 파일 f 역 질렬화하기 :

デシリアライズするにはf かれた text file だとするとのようになります:

x = json.load(f)


 





더 보기


pickle - 피클 모듈

JSON 에 반해, pickle 은 임의의 복잡한 파이썬 객체들을 직렬화할 수 있는 프로토콜입니다. 파이썬에 국한되고 다른 언어로 작성된 응용 프로그램들과 통신하는데 사용될 수 없습니다. 기본적으로 안전하지 않기도 합니다: 믿을 수 없는 소스에서 온 데이터를 역 직렬화할 때, 숙련된 공격자에 의해 데이터가 조작되었다면 임의의 코드가 실행될 수 있습니다.


pickle - pickle モジュール

JSON とは対照的pickle 任意複雑Python オブジェクトをシリアライズ可能なプロトコルですしかしPython 特有のプロトコルで言語記述されたアプリケーションと通信するのには使えませんさらにデフォルトでは安全でなく信頼できない送信元からられてきたスキルのある攻撃者によって生成された pickle データをデシリアライズすると攻撃者により任意のコードが実行されてしまいます