파일을 사전으로 변환하는 방법은 무엇입니까?


94

두 개의 열로 구성된 파일이 있습니다.

1 a 
2 b 
3 c

열 1이 키이고 열 2가 값이되도록이 파일을 사전에 읽어보고 싶습니다. 즉,

d = {1:'a', 2:'b', 3:'c'}

파일이 작기 때문에 효율성은 문제가되지 않습니다.

답변:


155
d = {}
with open("file.txt") as f:
    for line in f:
       (key, val) = line.split()
       d[int(key)] = val

1
with 문을 설명해 주시겠습니까?
VGE 2011 년

12
with여기에서 파일 정리를 처리하는 데 사용됩니다. 블록을 벗어나면 (정상적인 실행 흐름이나 예외에 의해) 파일이 자동으로 닫힙니다. Python의 컨텍스트 관리자에 대한 자세한 내용은 여기에서 읽을 수 있습니다. effbot.org/zone/python-with-statement.htm
Vlad H

1
for line in open("file.txt"):같은 방식으로 정리하십시오. 그리고 f가 로컬 값 f이면 스코프가 손실되면 해제됩니다. 이 명령문이 유용한 유일한 경우는 긴 함수 (품질에 좋지 않음) 또는 전역 변수를 사용하는 경우입니다.
VGE

1
@VGE 는 같은 방식으로 정리 for line in open('file.txt')하지 않습니다 . 모든 Python 구현이 동일하지는 않습니다. with블록이 종료 될 때 파일이 닫히도록 보장합니다. 때 for라인이 완료되면 close 수있다 라고. CPython하지만 같은 버전 IronPython에는 게으른 가비지 수집기가 있습니다.
Mark Tolonen 2013

2
여기에 int가 정말로 필요합니까? 아마도 그는 숫자가 문자열 이길 원했을까요?
GL2014 2014 년

15

그러면 키가 문자열로 남습니다.

with open('infile.txt') as f:
  d = dict(x.rstrip().split(None, 1) for x in f)

2
간단 dict([line.split() for line in f])하면 충분합니다.
user225312 2011 년

@sukhbir : 질문을 읽으면 op가 원하는 것이 아니라는 것을 알게 될 것입니다.
SilentGhost 2011

@SilentGhost : OP는 키를 정수로 원하지만 Ignacio의 솔루션 (내가 삭제 한 솔루션 포함)에는 키가 문자열로 포함되어 있습니다 (Ignacio 자신이 지적한대로).
user225312 2011 년

dict 인수를 전달할 때 왜 []가 필요하지 않은지 혼란 스러웠습니다. 즉 dict([x.rstrip().split(None, 1) for x in f])대신 dict(x.rstrip().split(None, 1) for x in f). 같은 것을 생각하는 사람들을 위해 전자는 여기에 설명 된대로 목록 이해력 대신 생성기 표현식입니다. python.org/dev/peps/pep-0289(PEP-289) . 새로운 것을 배웠습니다!
peaxol

1
@peaxol : 중간 목록을 만들지 않기 위해 목록 이해력 대신 생성기 표현식을 사용합니다.
Ignacio Vazquez-Abrams

8

다음 과 같은 사전 이해를 사용할 수도 있습니다 .

with open("infile.txt") as f:
    d = {int(k): v for line in f for (k, v) in [line.strip().split(None, 1)]}

5
def get_pair(line):
    key, sep, value = line.strip().partition(" ")
    return int(key), value

with open("file.txt") as fd:    
    d = dict(get_pair(line) for line in fd)

1
왜 안돼 partition? 그리고 with진술?
SilentGhost 2011 년

@SilentGhost : 파티션에 대해 몰랐습니다! 하지만이 경우 str.split이 더 나은 이유는 무엇입니까? "with"와 관련하여 : 아마도 당신은 나를 위해 이것을 명확히 할 수 있습니다 : 파일 설명자가 닫히기 위해 범위를 벗어나는 것으로 충분하지 않습니까? 예외적으로 파일 주 파일이 열려 있다고 생각합니다. 변경하겠습니다.
tokland

partition더 빠르고 정확하게이 목적을 위해 만들어졌습니다.
SilentGhost 2011 년

설명자가 닫혀 있는지 여부는 구현의 세부 사항입니다. with확인하는 간단한 방법입니다.
SilentGhost 2011 년

그것은 여전히 ​​필요 strip하다고 말할 것입니다.
SilentGhost 2011 년

3

사전 이해로

d = { line.split()[0] : line.split()[1] for line in open("file.txt") }

또는 판다

import pandas as pd 
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]

pandas는 첫 번째 열만 가져옵니다
Maulik Madhavi

1
@Samer Ayoub 위의 솔루션 (사전 이해력)은 키와 값이 모두 한 단어이면 작동합니다. 내 텍스트 파일에 다음 데이터가있는 경우 연도를 키로, 우승 팀을 값으로 만들려면 어떻게해야합니까? 1903 Boston Americans 1904 No World Series 1905 New York Giants 1906 Chicago White Sox 1907 Chicago Cubs 1908 Chicago Cubs
Ridhi

1
@Ridhi 뒤늦은 답장에 대해 죄송합니다. 첫 번째 공간에서만 분할 할 수 있습니다. stackoverflow.com/questions/30636248/… 또는 split ()에 대한 인수로 정규식을 사용합니다
Samer Ayoub

@ SamerAyoub- 감사합니다.
Ridhi

1

IMHO는 생성기를 사용하는 데 좀 더 비단뱀 적입니다 (아마 2.7+가 필요합니다) :

with open('infile.txt') as fd:
    pairs = (line.split(None) for line in fd)
    res   = {int(pair[0]):pair[1] for pair in pairs if len(pair) == 2 and pair[0].isdigit()}

또한 정수로 시작하지 않거나 정확히 두 항목을 포함하지 않는 행을 필터링합니다.


0
import re

my_file = open('file.txt','r')
d = {}
for i in my_file:
  g = re.search(r'(\d+)\s+(.*)', i) # glob line containing an int and a string
  d[int(g.group(1))] = g.group(2)

9
re? 진지하게?
SilentGhost 2011 년

이것이 최선의 방법이라고 생각하지 않습니다.
Donovan

@Seafoid는 "파일이 작기 때문에 효율성이 문제가되지 않습니다."라고 말했습니다. split()파일 형식이 정상이 아닌 경우 거의 조용히 작동하지 않습니다.
VGE 2011 년

0

하나의 라이너를 좋아한다면 다음을 시도하십시오.

d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')

입력 파일 = 파일 경로, SEP = 키-값 구분 문자

가장 우아하거나 효율적인 방법은 아니지만 그럼에도 불구하고 매우 흥미 롭습니다. :)


0

다른 옵션이 있습니다 ...

events = {}
for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")):
    if line[0][0] == "#":
        continue
    events[line[0]] = line[1] if len(line) == 2 else line[1:]

0

간단한 옵션

사전을 저장하는 대부분의 방법은 JSON, Pickle 또는 줄 읽기를 사용합니다. Python 외부에서 사전을 편집하지 않는 경우이 간단한 방법은 복잡한 사전에도 충분합니다. 더 큰 사전에는 Pickle이 더 좋습니다.

x = {1:'a', 2:'b', 3:'c'}
f = 'file.txt'
print(x, file=open(f,'w'))    # file.txt >>> {1:'a', 2:'b', 3:'c'}
y = eval(open(f,'r').read())
print(x==y)                   # >>> True

0

텍스트 파일에서 값을 가져와 키 값 쌍으로 사용해야한다는 요구 사항이있었습니다. 텍스트 파일에 키 = 값으로 내용이 있으므로 구분 기호가있는 분할 방법을 "="로 사용하고 코드 아래에 썼습니다.

d = {}
file = open("filename.txt")
for x in file:
    f = x.split("=")
    d.update({f[0].strip(): f[1].strip()})

strip 메소드를 사용하면 "="구분 기호 앞뒤의 공백이 제거되고 예상 데이터가 사전 형식으로 표시됩니다.


안녕하세요, Stack Overflow에 오신 것을 환영합니다! 귀하의 접근 방식은 다른 사용자와 다르지만 =질문에 답하기 위해을``로 바꾸도록 편집 할 수 있습니까?
Prunus Persica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.