sourcecode

csv 파일에서 사전을 생성하시겠습니까?

copyscript 2022. 9. 16. 23:04
반응형

csv 파일에서 사전을 생성하시겠습니까?

csv 파일에서 사전을 작성하려고 합니다.csv 파일의 첫 번째 열에는 고유한 키가 포함되어 있고 두 번째 열에는 값이 포함되어 있습니다.csv 파일의 각 행은 사전 내의 고유한 키와 값의 쌍을 나타냅니다.및 클래스를 사용하려고 했지만 각 행에 대해 새 사전을 생성하는 방법만 알 수 있었습니다.나는 사전 한 권을 원한다.사용하려는 코드는 다음과 같습니다.

import csv

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
    writer = csv.writer(outfile)
    for rows in reader:
        k = rows[0]
        v = rows[1]
        mydict = {k:v for k, v in rows}
    print(mydict)

위의 코드를 실행하면ValueError: too many values to unpack (expected 2)csv 파일에서 사전을 하나 만들려면 어떻게 해야 하나요?감사합니다.

당신이 찾고 있던 구문은 다음과 같습니다.

import csv

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = {rows[0]:rows[1] for rows in reader}

또는 python <= 2.7.1의 경우 다음을 원할 수 있습니다.

mydict = dict((rows[0],rows[1]) for rows in reader)

open을 호출하여 csv를 사용하여 파일을 엽니다.딕트 리더

input_file = csv.DictReader(open("coors.csv"))

input_file을 반복함으로써 csv 파일 dict reader 객체의 행에 걸쳐 반복할 수 있습니다.

for row in input_file:
    print(row)

또는 첫 번째 줄에만 액세스하려면

dictobj = csv.DictReader(open('coors.csv')).next() 

업데이트 python 3+ 버전에서는 이 코드가 약간 변경됩니다.

reader = csv.DictReader(open('coors.csv'))
dictobj = next(reader) 
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v

이것은 우아한 것이 아니라 판다를 이용한 한 줄의 해결책입니다.

import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()

인덱스에 dtype을 지정하는 경우(버그 때문에 index_col 인수를 사용하는 경우 read_csv에서는 지정할 수 없습니다).

import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()

csv.reader를 dict로 변환하기만 하면 됩니다.

~ >> cat > 1.csv
key1, value1
key2, value2
key2, value22
key3, value3

~ >> cat > d.py
import csv
with open('1.csv') as f:
    d = dict(filter(None, csv.reader(f)))

print(d)

~ >> python d.py
{'key3': ' value3', 'key2': ' value22', 'key1': ' value1'}

이 구조의 CSV가 있다고 가정합니다.

"a","b"
1,2
3,4
5,6

출력은 다음과 같습니다.

[{'a': '1', ' "b"': '2'}, {'a': '3', ' "b"': '4'}, {'a': '5', ' "b"': '6'}]

zip 기능(아직 언급되지 않음)은 간단하고 매우 유용합니다.

def read_csv(filename):
    with open(filename) as f:
        file_data=csv.reader(f)
        headers=next(file_data)
        return [dict(zip(headers,i)) for i in file_data]

팬더를 더 좋아한다면, 팬더가 이것을 아주 잘 할 수 있습니다.

import pandas as pd
def read_csv(filename):
    return pd.read_csv(filename).to_dict('records')

이것에도 numpy를 사용할 수 있습니다.

from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }

원라이너 솔루션

import pandas as pd

dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}

다음과 같은 단순한 csv 파일의 경우

id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3

빌트인만 사용하여 파이썬 사전으로 변환할 수 있습니다.

with open(csv_file) as f:
    csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]

(_, *header), *data = csv_list
csv_dict = {}
for row in data:
    key, *values = row   
    csv_dict[key] = {key: value for key, value in zip(header, values)}

그러면 다음과 같은 사전이 생성됩니다.

{'row1': {'col1': 'r1c1', 'col2': 'r1c2', 'col3': 'r1c3'},
 'row2': {'col1': 'r2c1', 'col2': 'r2c2', 'col3': 'r2c3'},
 'row3': {'col1': 'r3c1', 'col2': 'r3c2', 'col3': 'r3c3'},
 'row4': {'col1': 'r4c1', 'col2': 'r4c2', 'col3': 'r4c3'}}

주의: Python 사전에는 고유한 키가 있으므로 csv 파일에 중복된 키가 있는 경우ids각 행을 목록에 추가해야 합니다.

for row in data:
    key, *values = row

    if key not in csv_dict:
            csv_dict[key] = []

    csv_dict[key].append({key: value for key, value in zip(header, values)})

추가할 것을 제안합니다.if rows파일 끝에 빈 줄이 있는 경우

import csv
with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = dict(row[:2] for row in reader if row)

numpy 패키지 사용에 문제가 없다면 다음과 같은 작업을 수행할 수 있습니다.

import numpy as np

lines = np.genfromtxt("coors.csv", delimiter=",", dtype=None)
my_dict = dict()
for i in range(len(lines)):
   my_dict[lines[i][0]] = lines[i][1]

예를 들어, 다음과 같은 데이터를 CSV라고 합니다.test.txt/test.csv(CSV는 텍스트파일의 일종입니다)

a,b,c,d
1,2,3,4
5,6,7,8

지금은 판다를 사용하고 있다.

import pandas as pd
df = pd.read_csv("./text.txt")
df_to_doct = df.to_dict()

각 행에 대해 다음과 같이 됩니다.

df.to_dict(orient='records')

그리고 이것이 마지막입니다.

사용할 수 있습니다. 꽤 멋집니다.

import dataconverters.commas as commas
filename = 'test.csv'
with open(filename) as f:
      records, metadata = commas.parse(f)
      for row in records:
            print 'this is row in dictionary:'+rowenter code here

도 한 번 써보세요.defaultdict ★★★★★★★★★★★★★★★★★」DictReader.

import csv
from collections import defaultdict
my_dict = defaultdict(list)

with open('filename.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    for line in csv_reader:
        for key, value in line.items():
            my_dict[key].append(value)

반환:

{'key1':[value_1, value_2, value_3], 'key2': [value_a, value_b, value_c], 'Key3':[value_x, Value_y, Value_z]}

많은 솔루션이 게시되었으며 CSV 파일의 다른 열 수에 대해 작동하는 내 솔루션에 기여하고 싶습니다.그러면 열당 키가 하나씩 있는 사전이 생성되고 각 키의 값은 해당 열에 요소가 있는 목록입니다.

    input_file = csv.DictReader(open(path_to_csv_file))
    csv_dict = {elem: [] for elem in input_file.fieldnames}
    for row in input_file:
        for key in csv_dict.keys():
            csv_dict[key].append(row[key])

CSV에서 딕트로의 어프로치를 다음에 나타냅니다.

import pandas

data = pandas.read_csv('coors.csv')

the_dictionary_name = {row.k: row.v for (index, row) in data.iterrows()}

다음과 같은 경우:

  1. CSV에서는 1개의 키와 1개의 값만 키, 값으로 사용 가능
  2. 다른 패키지를 Import하지 않음
  3. 한 번에 받아쓰기 만들기

다음을 수행합니다.

mydict = {y[0]: y[1] for y in [x.split(",") for x in open('file.csv').read().split('\n') if x]}

그게 뭘 하는데?

이 명령어는 목록 이해를 사용하여 행을 분할하고 마지막 "if x"를 사용하여 빈 행(보통 끝)을 무시한 다음 사전 이해를 사용하여 딕트로 압축됩니다.

언급URL : https://stackoverflow.com/questions/6740918/creating-a-dictionary-from-a-csv-file

반응형