7. ì ë ¥ê³¼ ì¶ë ¥Â¶
íë¡ê·¸ë¨ì ì¶ë ¥ì íííë ì¬ë¬ ê°ì§ ë°©ë²ì´ ììµëë¤; ì¬ëì´ ì¼ê¸°ì ì í©í ííë¡ ë°ì´í°ë¥¼ ì¸ìí ìë ìê³ , ëì¤ì ì¬ì©í기 ìí´ íì¼ì ì¸ ìë ììµëë¤. ì´ ì¥ììë ëª ê°ì§ ê°ë¥ì±ì ë ¼í©ëë¤.
7.1. ì¥ìì ì¸ ì¶ë ¥ í¬ë§¤í ¶
ì§ê¸ê¹ì§ ì°ë¦¬ë ê°ì ì°ë ë ê°ì§ ë°©ë²ì ë§ë¬ìµëë¤: ííì ë¬¸ì¥ ê³¼ print() í¨ìì
ëë¤. (ì¸ ë²ì§¸ ë°©ë²ì íì¼ ê°ì²´ì write() ë©ìë를 ì¬ì©íë ê²ì
ëë¤; íì¤ ì¶ë ¥ íì¼ì sys.stdout ë¡ ì°¸ì¡°í ì ììµëë¤. ì´ê²ì ëí ìì¸í ì ë³´ë ë¼ì´ë¸ë¬ë¦¬ ë í¼ë°ì¤ë¥¼ ë³´ì¸ì.)
ì¢ ì¢ ë¨ìí ì¤íì´ì¤ë¡ 구ë¶ë ê°ì ì¸ìíë ê²ë³´ë¤ ì¶ë ¥ íìì ë ë§ì´ ì ì´í´ì¼ íë ê²½ì°ê° ììµëë¤. ì¶ë ¥ì í¬ë§·íë ë°ë ì¬ë¬ ê°ì§ ë°©ë²ì´ ììµëë¤.
í¬ë§· 문ìì´ ë¦¬í°ë´ì ì¬ì©íë ¤ë©´, ìì ì¸ì© ë¶í¸ ëë ì¼ì¤ ì¸ì© ë¶í¸ ìì
fëëF를 ë¶ì¬ 문ìì´ì ììíììì¤. ì´ ë¬¸ìì´ ììì,{ë°}문ì ì¬ì´ì, ë³ì ëë 리í°ë´ ê°ì 참조í ì ìë íì´ì¬ ííìì ìì±í ì ììµëë¤.>>> year = 2016 >>> event = 'Referendum' >>> f'Results of the {year} {event}' 'Results of the 2016 Referendum'
문ìì´ì
str.format()ë©ìëë ë ë§ì ììì ì ì구í©ëë¤. ë³ìê° ëì²´ ë ìì¹ë¥¼ íìí기 ìí´{ë°}를 ì¬ì í ì¬ì©íê³ , ìì¸í í¬ë§¤í ëë í°ë¸ë¥¼ ì ê³µí ì ìì§ë§, í¬ë§·í ì ë³´ë ì ê³µí´ì¼ í©ëë¤. ë¤ì ì½ë ë¸ë¡ìë ë³ì를 í¬ë§·íë ë°©ë²ì ëí ë ê°ì§ ìê° ììµëë¤:>>> yes_votes = 42_572_654 >>> total_votes = 85_705_149 >>> percentage = yes_votes / total_votes >>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage) ' 42572654 YES votes 49.67%'
Notice how the
yes_votesare padded with spaces and a negative sign only for negative numbers. The example also printspercentagemultiplied by 100, with 2 decimal places and followed by a percent sign (see Format specification mini-language for details).ë§ì§ë§ì¼ë¡, 문ìì´ ì¬ë¼ì´ì± ë° ì´ì´ë¶ì´ê¸° ì°ì°ì ì¬ì©íì¬ ììí ì ìë 모ë ë°°ì¹ë¥¼ ë§ë¦ì¼ë¡ì¨, 모ë 문ìì´ ì²ë¦¬ë¥¼ ì¤ì¤ë¡ ìíí ì ììµëë¤. 문ìì´íìë 주ì´ì§ ì´ ëë¹ë¡ 문ìì´ì ì±ì°ë ë° ì ì©í ì°ì°ì ìííë ëª ê°ì§ ë©ìëê° ììµëë¤.
ì¥ìì ì¸ ì¶ë ¥ì´ íìíì§ ìê³ ë¨ì§ ëë²ê¹
ì ìí´ ì¼ë¶ ë³ì를 ë¹ ë¥´ê² íìíë ¤ë©´, repr() ëë str() í¨ì를 ì¬ì©íì¬ ëª¨ë ê°ì 문ìì´ë¡ ë³íí ì ììµëë¤.
str() í¨ìë ì´ë ì ë ì¬ëì´ ì½ê¸°ì ì í©í ííë¡ ê°ì ííì ëë ¤ì£¼ê² ëì´ììµëë¤. ë°ë©´ì repr() ì ì¸í°í리í°ì ìí´ ì½í ì ìë íí를 ë§ë¤ê² ëì´ììµëë¤ (ëë ê·¸ë ê² ííí ì ìë 문ë²ì´ ìì¼ë©´ SyntaxError 를 ì¼ì¼í¤ëë¡ êµ¬ì±ë©ëë¤). ì¬ëì´ ìë¹í기 ìí í¹ë³í ííì´ ìë ê°ì²´ì ê²½ì°, str() ë repr() ê³¼ ê°ì ê°ì ëë ¤ì¤ëë¤. ë§ì ê°, ì«ìë¤ì´ë 리ì¤í¸ì ëì
ë리ì ê°ì 구조ë¤, ì ë í¨ì를 ì¸ ë ê°ì ííì í©ëë¤. í¹ë³í, 문ìì´ì ë ê°ì§ ííì í©ëë¤.
ëª ê°ì§ ì를 ëëë¤:
>>> 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...
>>> # 문ìì´ì repr() ì 문ìì´ ë°ì´íì ìì¬ëì를 ì¶ê°í©ëë¤:
>>> hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # repr() ì ì¸ìë¡ë 모ë íì´ì¬ ê°ì²´ê° ì¬ ì ììµëë¤:
>>> repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
The string module contains support for a simple templating approach
based upon regular expressions, via string.Template.
This offers yet another way to substitute values into strings,
using placeholders like $x and replacing them with values from a dictionary.
This syntax is easy to use, although it offers much less control for formatting.
7.1.1. í¬ë§· 문ìì´ ë¦¬í°ë´Â¶
í¬ë§· 문ìì´ ë¦¬í°ë´(ê°ë¨í f-문ìì´ì´ë¼ê³ ë í©ëë¤)ì 문ìì´ì f ëë F ì ëì´ë¥¼ ë¶ì´ê³ ííìì {expression}ë¡ ìì±íì¬ ë¬¸ìì´ì íì´ì¬ ííìì ê°ì ì½ì
í ì ìê² í©ëë¤.
ì íì ì¸ í¬ë§· ì§ì ìê° ííì ë¤ì ì¬ ì ììµëë¤. ì´ê²ì¼ë¡ ê°ì´ í¬ë§·ëë ë°©ìì ë ì êµíê² ì ì´í ì ììµëë¤. ë¤ì ìë ì주ì¨ì ììì ì´í ì¸ ìë¦¬ë¡ ë°ì¬ë¦¼í©ëë¤.
>>> 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()ì ì ì©í©ëë¤.:
>>> 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'.
The = specifier can be used to expand an expression to the text of the
expression, an equal sign, then the representation of the evaluated expression:
>>> bugs = 'roaches'
>>> count = 13
>>> area = 'living room'
>>> print(f'Debugging {bugs=} {count=} {area=}')
Debugging bugs='roaches' count=13 area='living room'
= ì§ì ìì ëí ìì¸í ë´ì©ì ì¤ì¤ë¡ ì¤ëª
íë ííìì 참조íì¸ì. ì´ë¬í í¬ë§· ì¬ìì ëí ë í¼ë°ì¤ë Format specification mini-languageì ëí ë í¼ë°ì¤ ì§ì¹¨ì를 참조íììì¤.
7.1.2. 문ìì´ format() ë©ìë¶
str.format() ë©ìëì 기본ì ì¸ ì¬ì©ë²ì ì´ë° ìì
ëë¤:
>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
ì¤ê´í¸ì ê·¸ ìì ìë 문ìë¤ (í¬ë§· íëë¼ê³ ë¶ë¥¸ë¤) ì str.format() ë©ìëë¡ ì ë¬ë ê°ì²´ë¤ë¡ ì¹íë©ëë¤. ì¤ê´í¸ ìì ì«ìë str.format() ë©ìëë¡ ì ë¬ë ê°ì²´ë¤ì ìì¹ë¥¼ ê°ë¦¬í¤ëë° ì¬ì©ë ì ììµëë¤.
>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam
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.
ëëê³ ì¶ì§ ìì ì ë§ ê¸´ í¬ë§· 문ìì´ì´ ìì ë, í¬ë§·í ë³ìë¤ì ìì¹ ëì ì ì´ë¦ì¼ë¡ ì§ì í ì ìë¤ë©´ ì¢ì ê²ì
ëë¤. ê°ë¨í ëì
ë리를 ëê¸°ê³ í¤ë¥¼ ì¡ì¸ì¤íëë° ëê´í¸ '[]' 를 ì¬ì©íë©´ ë©ëë¤.
>>> 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
** í기ë²ì ì¬ì©í´ì 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() ì í¨ê» ì¬ì©í ë í¹í ì¸ëª¨ê° ììµëë¤:
>>> table = {k: str(v) for k, v in vars().items()}
>>> message = " ".join([f'{k}: ' + '{' + k +'};' for k in table.keys()])
>>> print(message.format(**table))
__name__: __main__; __doc__: None; __package__: None; __loader__: ...
ì를 ë¤ì´, ë¤ì ì¤ì ì ìì ê·¸ ì 곱과 ì¸ì ê³±ì ì ê³µíë 빽빽íê² ì ë ¬ë ì´ ì§í©ì ìì±í©ëë¤:
>>> 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
str.format() 를 ì¬ì©í 문ìì´ í¬ë§¤í
ì ìì í ê°ìë Format string syntax ì ë³´ì¸ì.
7.1.3. ìë 문ìì´ í¬ë§¤í ¶
ì¬ê¸° ê°ì ì ê³±ìì ì¸ì ê³±ì í를 ìëì¼ë¡ í¬ë§¤í íìµëë¤:
>>> for x in range(1, 11):
... print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
... # ì ì¤ì 'end' ì¬ì©ì 주목íì¸ì
... 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() ì ëì ë°©ìì¼ë¡ ì¸í´ ê° ì¹¼ë¼ ì¬ì´ì ì¤íì´ì¤ íëê° ì¶ê°ëììì ì ìíì¸ì: íì ì¸ìë¤ ì¬ì´ì ì¤íì´ì¤ë¥¼ ì¶ê°í©ëë¤.)
문ìì´ ê°ì²´ì str.rjust() ë©ìëë ì¼ìª½ì ì¤íì´ì¤ë¥¼ ì±ìì 주ì´ì§ íì¼ë¡ 문ìì´ì ì°ì¸¡ ì¤ ë§ì¶¤í©ëë¤. ë¹ì·í ë©ìë str.ljust() ì str.center() ë ììµëë¤. ì´ ë©ìëë¤ì ì´ë¤ ê²ë ì¶ë ¥íì§ ììµëë¤, ë¨ì§ ì 문ìì´ì ëë ¤ì¤ëë¤. ì
ë ¥ 문ìì´ì´ ë무 길면, ìë¥´ì§ ìê³ , ë³ê²½ ìì´ ê·¸ë¥ ëë ¤ì¤ëë¤; ì´ê²ì´ ì´ ë°°ì¹ë¥¼ ìë§ì¼ë¡ ë§ë¤ê² ì§ë§, ë³´íµ ê°ì ëí´ ê±°ì§ë§ì íê² ë ëìë³´ë¤ë ë«ìµëë¤. (ì ë§ë¡ ìë¼ë´ê¸°ë¥¼ ìíë¤ë©´, íì ì¬ë¼ì´ì¤ ì°ì°ì ì¶ê°í ì ììµëë¤, x.ljust(n)[:n] ì²ë¼.)
ë¤ë¥¸ ë©ìëë ììµëë¤, str.zfill(). ì«ì 문ìì´ì ì¼ìª½ì 0ì ì±ìëë¤. íë¬ì¤ì ë§ì´ëì¤ ë¶í¸ë ì´í´í©ëë¤:
>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
7.1.4. ìì ì 문ìì´ í¬ë§¤í ¶
% ì°ì°ì(모ëë¡)ë 문ìì´ í¬ë§¤í
ìë ì¬ì©í ì ììµëë¤. format % valuesê° ì£¼ì´ì§ë©´ (formatì 문ìì´ì
ëë¤), formatì ìë % ë³í ëª
ì¸ë 0ê° ì´ìì values ììë¡ ëì²´ë©ëë¤. ì´ ì°ì°ì íí 문ìì´ ë³´ê°(interpolation)ì´ë¼ê³ í©ëë¤. ì를 ë¤ë©´:
>>> import math
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.
ë ìì¸í ë´ì©ì printf ì¤íì¼ ë¬¸ìì´ í¬ë§¤í ì¹ì ì ëìµëë¤.
7.2. íì¼ì ì½ê³ ì°ê¸°Â¶
open() ì íì¼ ê°ì²´ 를 ëë ¤ì£¼ê³ , ë ê°ì ìì¹ ì¸ìì íëì í¤ìë ì¸ì를 주ë ë°©ìì´ ê°ì¥ ë§ì´ ì¬ì©ë©ëë¤: open(filename, mode, encoding=None)
>>> f = open('workfile', 'w', encoding="utf-8")
첫 ë²ì§¸ ì¸ìë íì¼ ì´ë¦ì ë´ì 문ìì´ì
ëë¤. ë ë²ì§¸ ì¸ìë íì¼ì´ ì¬ì©ë ë°©ìì ì¤ëª
íë ëª ê°ì 문ìë¤ì ë´ì ë íëì 문ìì´ì
ëë¤. mode ë íì¼ì ì½ê¸°ë§ íë©´ 'r', ì°ê¸°ë§ íë©´ 'w' (ê°ì ì´ë¦ì ì´ë¯¸ ì¡´ì¬íë íì¼ì ìì ë©ëë¤) ê° ëê³ , 'a' ë íì¼ì ë§ë¶ì´ê¸° ìí´ ì½ëë¤; íì¼ì 기ë¡ëë 모ë ë°ì´í°ë ìëì¼ë¡ ëì ë¶ìµëë¤. 'r+' ë íì¼ì ì½ê³ ì°ê¸° ìí´ ì½ëë¤. mode ì¸ìë ì íì ì¸ë°, ìëµíë©´ 'r' ì´ ê°ì ë©ëë¤.
ë³´íµ, íì¼ì í
ì¤í¸ 모ë (text mode) ë¡ ì´ë¦¬ëë°, ì´ ë»ì, íì¼ì 문ìì´ì ì½ê³ ì°ê³ , íì¼ìë í¹ì í encodingì¼ë¡ ì¸ì½ë©ëë¤ë ê²ì
ëë¤. encodingì´ ì§ì ëì§ ìì¼ë©´ 기본ê°ì íë«í¼ ìì¡´ì ì
ëë¤ (open() ì ë³´ì¸ì). UTF-8 ì´ ì¬ì¤ìì ìµì íì¤ì´ë¯ë¡, ë¤ë¥¸ ì¸ì½ë©ì ì¬ì©í´ì¼ íë ê²½ì°ê° ìëë¼ë©´ encoding="utf-8"를 ê¶í©ëë¤. mode ì 'b'를 ë§ë¶ì´ë©´ íì¼ì ë°ì´ë리 모ë (binary mode) ë¡ ì½ëë¤. ì´ì ë°ì´í°ë ë°ì´í¸ì´ ê°ì²´ì ííë¡ ì½ê³ ì°ì
ëë¤. í
ì¤í¸ë¥¼ í¬í¨íì§ ìë 모ë íì¼ìë ì´ ëª¨ë를 ì¬ì©í´ì¼ í©ëë¤. ë°ì´ë리 모ë ë°ì´í°ë bytes ê°ì²´ë¡ ì½ê³ ìëë¤. ë°ì´ë리 모ëë¡ íì¼ì ì´ ëë encodingì ì§ì í ì ììµëë¤.
í
ì¤í¸ 모ëìì, ì½ì ëì 기본 ëìì íë«í¼ ìì¡´ì ì¸ ì¤ ì¢
ë£ (ì ëì¤ìì \n, ìëì°ìì \r\n) 를 ë¨ì§ \n ë¡ ë³ê²½íë ê²ì
ëë¤. í
ì¤í¸ 모ëë¡ ì¸ ë, 기본 ëìì \n 를 ë¤ì íë«í¼ ìì¡´ì ì¸ ì¤ ì¢
ë£ë¡ ë³ííë ê²ì
ëë¤. ì´ íì¼ ë°ì´í°ì ëí 무ë ë¤ì ìì ì í
ì¤í¸ íì¼ì ê²½ì°ë 문ì ê° ì ëì§ë§, JPEG ì´ë EXE íì¼ê³¼ ê°ì ë°ì´ë리 ë°ì´í°ë¥¼ ë§ì¹ê² ë©ëë¤. ê·¸ë° íì¼ì ì½ê³ ì¸ ë ë°ì´ë리 모ë를 ì¬ì©íëë¡ ì£¼ìíì¸ì.
íì¼ ê°ì²´ë¥¼ ë¤ë£° ë with í¤ìë를 ì¬ì©íë ê²ì ì¢ì ìµê´ì
ëë¤. ííì ëì¤ ìì¸ê° ë°ìíëë¼ë ì¤ìí¸ê° ì¢
ë£ë ë íì¼ì´ ì¬ë°ë¥´ê² ë«íë¤ë ê²ì
ëë¤. with 를 ì¬ì©íë ê²ì ëë±í try-finally ë¸ë¡ì ì°ë ê²ì ë¹êµí´ í¨ì¬ 짧기ë í©ëë¤:
>>> with open('workfile', encoding="utf-8") as f:
... read_data = f.read()
>>> # íì¼ì´ ìëì¼ë¡ ë«íëì§ íì¸í ì ììµëë¤.
>>> f.closed
True
with í¤ìë를 ì¬ì©íì§ ìì¼ë©´, f.close() 를 í¸ì¶í´ì íì¼ì ë«ê³ ì¬ì©ë ìì¤í
ììì ì¦ì ë°ë©í´ì¼ í©ëë¤.
ê²½ê³
with í¤ìë를 ì¬ì©íê±°ë f.close()를 í¸ì¶íì§ ìê³ f.write()를 í¸ì¶íë©´ íë¡ê·¸ë¨ì´ ì±ê³µì ì¼ë¡ ì¢
ë£ëëë¼ë f.write()ì ì¸ìê° ëì¤í¬ì ìì í 기ë¡ëì§ ìì ì ììµëë¤.
íì¼ ê°ì²´ê° ë«í íìë, 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. íì¼ ê°ì²´ì 매ìë¶
ì´ ì¹ì
ì ëë¨¸ì§ ìë¤ì f ë¼ë íì¼ ê°ì²´ê° ì´ë¯¸ ë§ë¤ì´ì¡ë¤ê³ ê°ì í©ëë¤.
íì¼ì ë´ì©ì ì½ì¼ë ¤ë©´, f.read(size) 를 í¸ì¶íëë°, ì¼ì ëì ë°ì´í°ë¥¼ ì½ê³ 문ìì´ (í
ì¤í¸ 모ë ìì) ì´ë ë°ì´í¸ì´ (ë°ì´ë리 모ëìì) ë¡ ëë ¤ì¤ëë¤. size ë ì íì ì¸ ì«ì ì¸ìì
ëë¤. size ê° ìëµëê±°ë ììë©´ íì¼ì ë´ì© ì 체를 ì½ì´ì ëë ¤ì¤ëë¤; íì¼ì í¬ê¸°ê° 기ê³ì ë©ëª¨ë¦¬ë³´ë¤ ë ë°° í¬ë¤ë©´ ì¬ë¬ë¶ì´ ê°ë¹í 문ì ì
ëë¤. ê·¸ë ì§ ìì¼ë©´ ìµë size 문ì(í
ì¤í¸ 모ëìì)ë size ë°ì´í¸(ë°ì´ë리 모ëìì)를 ì½ê³ ëë ¤ì¤ëë¤. íì¼ì ëì ëë¬íë©´, f.read() ë ë¹ ë¬¸ìì´ ('') ì ëë ¤ì¤ëë¤.
>>> f.read()
'This is the entire file.\n'
>>> f.read()
''
f.readline() ì íì¼ìì í ì¤ì ì½ìµëë¤; ê°í 문ì (\n) ë 문ìì´ì ëì ë³´ì¡´ëê³ , íì¼ì´ ê°í문ìë¡ ëëì§ ìë ëìë§ íì¼ì ë§ì§ë§ ì¤ììë§ ìëµë©ëë¤. ì´ë ê² ë°í ê°ì 모í¸íì§ ìê² ë§ëëë¤; f.readline() ê° ë¹ ë¬¸ìì´ì ëë ¤ì£¼ë©´, íì¼ì ëì ëë¬í ê²ì´ì§ë§, ë¹ ì¤ì '\n', ì¦ íëì ê°í문ìë§ì í¬í¨íë 문ìì´ë¡ ííë©ëë¤.
>>> 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() 를 ì¸ ì ììµëë¤.
f.write(string) ì string ì ë´ì©ì íì¼ì ì°ê³ , ì¶ë ¥ë 문ìë¤ì ê°ì를 ëë ¤ì¤ëë¤.
>>> f.write('This is a test\n')
15
ë¤ë¥¸ íì ê°ì²´ë¤ì ì°ê¸° ì ì ë³íë íìê° ììµëë¤ â 문ìì´ (í ì¤í¸ 모ëìì) ì´ë ë°ì´í¸ì´ ê°ì²´ (ë°ì´ë리 모ëìì) ë¡ â:
>>> value = ('the answer', 42)
>>> s = str(value) # ííì 문ìì´ë¡ ë³íí©ëë¤
>>> f.write(s)
18
f.tell() ì íì¼ì íì¬ ìì¹ë¥¼ ê°ë¦¬í¤ë ì ì를 ëë ¤ì£¼ëë°, ë°ì´ë리 모ëì ê²½ì° íì¼ì ì²ìë¶í°ì ë°ì´í¸ ìë¡ ííëê³ í
ì¤í¸ 모ëì ê²½ì°ë ë¶í¬ëª
í ì«ìì
ëë¤.
íì¼ ê°ì²´ì ìì¹ë¥¼ ë°ê¾¸ë ¤ë©´, f.seek(offset, whence) 를 ì¬ì©í©ëë¤. ìì¹ë 기ì¤ì ì offset ì ëí´ì ê³ì°ë©ëë¤; 기ì¤ì ì whence ì¸ìë¡ ì íí©ëë¤. whence ê°ì´ 0ì´ë©´ íì¼ì ì²ìë¶í° 측ì íê³ , 1ì´ë©´ íì¬ íì¼ ìì¹ë¥¼ ì¬ì©íê³ , 2 ë íì¼ì ëì 기ì¤ì ì¼ë¡ ì¬ì©í©ëë¤. whence ë ìëµë ì ìê³ , 기본ê°ì 0ì´ë¼ì íì¼ì ì²ìì 기ì¤ì ì¼ë¡ ì¬ì©í©ëë¤.
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # íì¼ì 6ë²ì§¸ ë°ì´í¸ë¡ ì´ëí©ëë¤
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # ëìì 3ë²ì§¸ ë°ì´í¸ë¡ ì´ëí©ëë¤
13
>>> f.read(1)
b'd'
í
ì¤í¸ íì¼ììë (모ë 문ìì´ì b ê° ìì´ ì´ë¦° ê²ë¤), íì¼ì ììì ìëì ì¸ ìì¹ ë³ê²½ë§ íë½ëê³ (ìì¸ë seek(0, 2) 를 ì¬ì©í´ì íì¼ì ëì¼ë¡ ìì¹ë¥¼ ë³ê²½íë ê²½ì°ì
ëë¤), ì¬ë°ë¥¸ offset ê°ì f.tell() ì´ ëë ¤ì¤ ê°ê³¼ 0ë¿ì
ëë¤. ê·¸ ë°ì ë¤ë¥¸ offset ê°ì ì ìëì§ ìì 결과를 ë³ìµëë¤.
íì¼ ê°ì²´ë isatty() ë truncate() ê°ì ëª ê°ì§ ë©ìë를 ë ê°ê³ ìëë°, ë ì주 ì¬ì©ë©ëë¤; íì¼ ê°ì²´ì ëí ìì í ìë´ë ë¼ì´ë¸ë¬ë¦¬ ë í¼ë°ì¤ë¥¼ 참조íì¸ì.
7.2.2. json ì¼ë¡ 구조ì ì¸ ë°ì´í°ë¥¼ ì ì¥í기¶
문ìì´ì íì¼ì ì½ê² ì½ê³ ì¸ ì ììµëë¤. ì«ìë ì½ê°ì ìê³ ë¥¼ í´ì¼ íëë°, read() ë©ìëê° ë¬¸ìì´ë§ì ëë ¤ì£¼ê¸° ë문ì
ëë¤. ì´ ë¬¸ìì´ì int() ê°ì í¨ìë¡ ì ë¬í´ì¼ë§ íëë°, '123' ê°ì 문ìì´ì ë°ê³ ì«ì ê° 123ì ëë ¤ì¤ëë¤. ì¤ì²©ë 리ì¤í¸ë ëì
ë리 ê°ì ë ë³µì¡í ë°ì´í°ë¥¼ ì ì¥íë ¤ê³ í ë, ììì
ì¼ë¡ íì±íê³ ì§ë ¬ííë ê²ì´ ê¹ë¤ë¡ì¸ ì ììµëë¤.
ì¬ì©ìê° ë°ë³µì ì¼ë¡ ë³µì¡í ë°ì´í°íì íì¼ì ì ì¥íë ì½ë를 ìì±íê³ ëë²ê¹
íëë¡ íë ëì , íì´ì¬ì JSON (JavaScript Object Notation) ì´ë¼ë ë리 ì°ì´ë ë°ì´í° êµí íìì ì¬ì©í ì ìê² í©ëë¤. json ì´ë¼ë íì¤ ëª¨ëì íì´ì¬ ë°ì´í° ê³ì¸µì ë°ìì 문ìì´ ííì¼ë¡ ë°ê¿ì¤ëë¤; ì´ ì 차를 ì§ë ¬í (serializing) ë¼ê³ ë¶ë¦
ëë¤. 문ìì´ ííì¼ë¡ë¶í° ë°ì´í°ë¥¼ ì¬êµ¬ì±íë ê²ì ì ì§ë ¬í (deserializing) ë¼ê³ ë¶ë¦
ëë¤. ì§ë ¬íì ì ì§ë ¬í ì¬ì´ìì, ê°ì²´ë¥¼ íííë 문ìì´ì íì¼ì´ë ë°ì´í°ì ì ì¥ëê±°ë ë¤í¸ìí¬ ì°ê²°ì íµí´ ì격 기ê³ë¡ ì ì¡ë ì ììµëë¤.
ì°¸ê³
JSON íìì ë°ì´í° êµíì ìí´ íë ìì© íë¡ê·¸ë¨ë¤ì´ ì주 ì¬ì©í©ëë¤. ë§ì íë¡ê·¸ëë¨¸ê° ì´ë¯¸ ì´ê²ì ìµìíë¯ë¡, ì°ëì±ì ìí ì¢ì ì íì´ ë©ëë¤.
ê°ì²´ x ê° ìì ë, ê°ë¨í í ì¤ì ì½ëë¡ ê·¸ê²ì JSON 문ìì´ ííì ë³¼ ì ììµëë¤:
>>> import json
>>> x = [1, 'simple', 'list']
>>> json.dumps(x)
'[1, "simple", "list"]'
dump()ë¼ë dumps() í¨ìì ë³ì¢
ì ê°ì²´ë¥¼ í
ì¤í¸ íì¼ ë¡ ì§ë ¬íí©ëë¤. ê·¸ëì f ê° ì°ê¸°ë¥¼ ìí´ ì´ë¦° í
ì¤í¸ íì¼ ì´ë©´, ì´ë ê² í ì ììµëë¤:
json.dump(x, f)
ê°ì²´ë¥¼ ë¤ì ëì½ëíë ¤ë©´, f ê° ì½ê¸°ë¥¼ ìí´ ì´ë¦° ë°ì´ë리 íì¼ì´ë í
ì¤í¸ íì¼ ê°ì²´ì¼ ë:
x = json.load(f)
ì°¸ê³
JSON files must be encoded in UTF-8. Use encoding="utf-8" when opening
JSON file as a text file for both of reading and writing.
ì´ ê°ë¨í ì§ë ¬í í
í¬ëì´ ë¦¬ì¤í¸ì ëì
ë리를 ë¤ë£° ì ìì§ë§, ììì í´ëì¤ ì¸ì¤í´ì¤ë¥¼ JSON ì¼ë¡ ì§ë ¬íí기 ìí´ìë ì½ê°ì ìê³ ê° ë íìí©ëë¤. json 모ëì ë í¼ë°ì¤ë ì´ ë°©ë²ì ëí ì¤ëª
ì ë´ê³ ììµëë¤.
ë 보기
pickle - í¼í´ 모ë
JSON ì ë°í´, pickle ì ììì ë³µì¡í íì´ì¬ ê°ì²´ë¤ì ì§ë ¬íí ì ìë íë¡í ì½ì ëë¤. íì´ì¬ì êµíëê³ ë¤ë¥¸ ì¸ì´ë¡ ìì±ë ìì© íë¡ê·¸ë¨ë¤ê³¼ íµì íëë° ì¬ì©ë ì ììµëë¤. 기본ì ì¼ë¡ ìì íì§ ì기ë í©ëë¤: 믿ì ì ìë ìì¤ìì ì¨ ë°ì´í°ë¥¼ ì ì§ë ¬íí ë, ìë ¨ë 공격ìì ìí´ ë°ì´í°ê° ì¡°ìëìë¤ë©´ ììì ì½ëê° ì¤íë ì ììµëë¤.