Python Dict 및 파일

음성기록 해시 테이블

Python의 효율적인 키/값 해시 테이블 구조를 'dict'라고 합니다. dict의 내용은 중괄호 { } 안에 일련의 키:값 쌍으로 작성될 수 있습니다(예: dict = {key1:value1, key2:value2, ... }). "empty dict"는 단지 빈 중괄호 {} 쌍입니다.

dict에서 값을 조회하거나 설정하려면 대괄호를 사용합니다. 예를 들어 dict['foo'] 는 'foo' 키 아래에서 값을 조회합니다. 문자열, 숫자, 튜플은 키로 작동하며 모든 유형이 값이 될 수 있습니다. 다른 유형은 키로 올바르게 작동할 수도 있고 작동하지 않을 수도 있습니다 (문자열과 튜플은 변경할 수 없으므로 깔끔하게 작동함). dict에 없는 값을 조회하면 KeyError가 발생합니다. 'in'을 사용하여 키가 dict에 있는지 확인하거나 dict.get(key)를 사용하여 값을 반환하거나 키가 없으면 None을 반환하거나 get(key, not-found)을 통해 찾을 수 없는 경우 반환할 값을 지정할 수 있습니다.

  ## Can build up a dict by starting with the empty dict {}
  ## and storing key/value pairs into the dict like this:
  ## dict[key] = value-for-that-key
  dict = {}
  dict['a'] = 'alpha'
  dict['g'] = 'gamma'
  dict['o'] = 'omega'

  print(dict) ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'}

  print(dict['a'])     ## Simple lookup, returns 'alpha'
  dict['a'] = 6       ## Put new key/value into dict
  'a' in dict         ## True
  ## print(dict['z'])                  ## Throws KeyError
  if 'z' in dict: print(dict['z'])     ## Avoid KeyError
  print(dict.get('z'))  ## None (instead of KeyError)

'a' 'o' 'g' 키가 있는 사전

사전의 for 루프는 기본적으로 키에서 반복됩니다. 키는 임의의 순서로 표시됩니다. dict.keys() 및 dict.values() 메서드는 키 또는 값 목록을 명시적으로 반환합니다. (키, 값) 튜플 목록을 반환하는 items()도 있습니다. 이 목록은 사전의 모든 키-값 데이터를 검사하는 가장 효율적인 방법입니다. 이러한 목록은 모두 정렬() 함수에 전달될 수 있습니다.

  ## By default, iterating over a dict iterates over its keys.
  ## Note that the keys are in a random order.
  for key in dict:
    print(key)
  ## prints a g o

  ## Exactly the same as above
  for key in dict.keys():
    print(key)

  ## Get the .keys() list:
  print(dict.keys())  ## dict_keys(['a', 'o', 'g'])

  ## Likewise, there's a .values() list of values
  print(dict.values())  ## dict_values(['alpha', 'omega', 'gamma'])

  ## Common case -- loop over the keys in sorted order,
  ## accessing each key/value
  for key in sorted(dict.keys()):
    print(key, dict[key])

  ## .items() is the dict expressed as (key, value) tuples
  print(dict.items())  ##  dict_items([('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')])

  ## This loop syntax accesses the whole dict by looping
  ## over the .items() tuple list, accessing one (key, value)
  ## pair on each iteration.
  for k, v in dict.items(): print(k, '>', v)
  ## a > alpha    o > omega     g > gamma

전략 참고사항: 성능 관점에서 볼 때 사전은 가장 큰 도구 중 하나이므로 데이터를 쉽게 구성할 수 있는 경우에만 사전을 사용해야 합니다. 예를 들어 각 행이 IP 주소로 시작하는 로그 파일을 읽고 IP 주소를 키로 사용하여 데이터를 dict에 저장하고 이 주소가 값으로 표시되는 행 목록을 dict에 저장할 수 있습니다. 전체 파일을 읽은 후에는 모든 IP 주소를 조회하고 해당 행의 목록을 즉시 확인할 수 있습니다. 사전은 분산된 데이터를 가져와 일관된 것으로 만듭니다.

음성기록 형식 지정

% 연산자는 사전의 값을 이름으로 문자열로 대체할 수 있는 편리한 기능입니다.

  h = {}
  h['word'] = 'garfield'
  h['count'] = 42
  s = 'I want %(count)d copies of %(word)s' % h  # %d for int, %s for string
  # 'I want 42 copies of garfield'

  # You can also use str.format().
  s = 'I want {count:d} copies of {word}'.format(h)

Del

'del' 연산자는 삭제를 수행합니다. 가장 간단한 경우, 마치 변수가 정의되지 않은 것처럼 변수 정의를 삭제할 수 있습니다. 목록 요소 또는 슬라이스에 Del을 사용하여 목록의 해당 부분을 삭제하고 사전에서 항목을 삭제할 수도 있습니다.

  var = 6
  del var  # var no more!

  list = ['a', 'b', 'c', 'd']
  del list[0]     ## Delete first element
  del list[-2:]   ## Delete last two elements
  print(list)      ## ['b']

  dict = {'a':1, 'b':2, 'c':3}
  del dict['b']   ## Delete 'b' entry
  print(dict)      ## {'a':1, 'c':3}

Files

open() 함수가 열리고 일반적인 방법으로 파일을 읽거나 쓰는 데 사용할 수 있는 파일 핸들을 반환합니다. 코드 f = open('name', 'r')은 파일을 읽기 작업을 위해 변수 f로 열고 완료되면 f.close()를 사용합니다. 'r' 대신 쓰기에는 'w'를, 추가에는 'a'를 사용합니다. 표준 for-loop는 텍스트 파일에 대해 작동하면서 파일의 행을 반복합니다 (이진 파일은 텍스트 파일이 아닌 텍스트 파일에서만 작동함). for 루프 기법은 텍스트 파일의 모든 줄을 보는 간단하고 효율적인 방법입니다.

  # Echo the contents of a text file
  f = open('foo.txt', 'rt', encoding='utf-8')
  for line in f:   ## iterates over the lines of the file
    print(line, end='')    ## end='' so print does not add an end-of-line char
                           ## since 'line' already includes the end-of-line.
  f.close()

한 번에 한 줄씩 읽는 것은 모든 파일을 한 번에 메모리에 다 담을 필요는 없다는 좋은 품질입니다. 10GB의 메모리를 사용하지 않고 10GB 파일의 모든 줄을 보려는 경우 편리합니다. f.readlines() 메서드는 전체 파일을 메모리로 읽고 해당 콘텐츠를 행 목록으로 반환합니다. f.read() 메서드는 전체 파일을 단일 문자열로 읽습니다. 정규 표현식과 같이 텍스트를 한 번에 처리하는 편리한 방법이 될 수 있습니다. 이 방법은 나중에 알아보겠습니다.

쓰기의 경우 f.write(string) 메서드는 열린 출력 파일에 데이터를 쓰는 가장 쉬운 방법입니다. 또는 'print(string, file=f)'와 같이 열린 파일에서 'print'를 사용할 수 있습니다.

파일 유니코드

유니코드로 인코딩된 파일을 읽고 쓰려면 `'t'` 모드를 사용하고 인코딩을 명시적으로 지정하세요.


with open('foo.txt', 'rt', encoding='utf-8') as f:
  for line in f:
    # here line is a *unicode* string

with open('write_test', encoding='utf-8', mode='wt') as f:
    f.write('\u20ACunicode\u20AC\n') #  €unicode€
    # AKA print('\u20ACunicode\u20AC', file=f)  ## which auto-adds end='\n'

증분 개발 연습

Python 프로그램을 빌드할 때 한 번에 전체를 작성하지 마십시오. 대신 첫 번째 마일스톤만 식별하세요. 예: "첫 번째 단계는 단어 목록을 추출하는 것입니다." 이 마일스톤에 도달하기 위한 코드를 작성하고 해당 시점의 데이터 구조만 출력하면 sys.exit(0)를 실행하여 프로그램이 완료되지 않은 부분으로 앞서 실행되지 않도록 할 수 있습니다. 마일스톤 코드가 작동하면 다음 마일스톤을 위한 코드 작업을 할 수 있습니다. 한 상태에서 변수 출력을 확인할 수 있으면 다음 상태로 넘어가기 위해 변수를 어떻게 변환해야 하는지 생각할 수 있습니다. Python은 이 패턴을 사용하여 매우 빠르게 수행하므로 약간 변경하고 프로그램을 실행하여 어떻게 작동하는지 확인할 수 있습니다. 이 빠른 처리 시간을 활용하여 간단한 단계를 거쳐 프로그램을 구축하세요.

연습: wordcount.py

문자열, 목록, 사전, 튜플, 파일 등 기본적인 Python 자료를 모두 결합하여 기본 연습의 요약 wordcount.py 연습을 시도해 보세요.