Как мне загрузить файл в словарь, где массив: текст, вал: число, число с плавающей точкой? - PullRequest
1 голос
/ 26 октября 2019

Файл, который я хочу использовать, имеет формат;

a, 1.1, 2.2, 3.3, 4.4
b, 5.5, 6.6, 7.7, 8.8
c, 9.9, ..., ..., ...

и мне нужно преобразовать это в Ключи словаря по первому столбцу со связанными значениями, являющимися массивом из 4 цифр. Это работает на Python 3.

До сих пор я пытался разделить их на два набора данных, используя line.split, но я не уверен, куда идти дальше или если это даже правильно:

d = {}
with open("filex.csv") as f:
    for line in f:
        (key, val) = line.split(",", 1)

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Это самый простой способ сделать это:

import numpy as np
d = {}
with open("filex.csv") as f:
    for line in f:
        splits = line.split(",")
        key = splits[0]
        d[key] = np.array([s.strip() for s in splits[1:]])
0 голосов
/ 27 октября 2019

Мы можем загрузить файл с помощью genfromtxt несколькими способами:

In [10]: txt = """a, 1.1, 2.2, 3.3, 4.4 
    ...: b, 5.5, 6.6, 7.7, 8.8""".splitlines()                                  
In [11]: data = np.genfromtxt(txt, delimiter=',', dtype=None, encoding=None)    
In [12]: data                                                                   
Out[12]: 
array([('a', 1.1, 2.2, 3.3, 4.4), ('b', 5.5, 6.6, 7.7, 8.8)],
      dtype=[('f0', '<U1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8')])
In [13]: data['f0']                                                             
Out[13]: array(['a', 'b'], dtype='<U1')
In [14]: data['f1']                                                             
Out[14]: array([1.1, 5.5])

Это помещает каждый столбец в отдельное поле.

Но для ваших целей мы могли бы уточнить dtype -используя поле из 4 столбцов:

In [15]: data = np.genfromtxt(txt, delimiter=',', dtype=[('key','U2'),('data',float,4)], encoding=None)                                                
In [16]: data                                                                   
Out[16]: 
array([('a', [1.1, 2.2, 3.3, 4.4]), ('b', [5.5, 6.6, 7.7, 8.8])],
      dtype=[('key', '<U2'), ('data', '<f8', (4,))])
In [17]: data['key']                                                            
Out[17]: array(['a', 'b'], dtype='<U2')
In [18]: data['data']                                                           
Out[18]: 
array([[1.1, 2.2, 3.3, 4.4],
       [5.5, 6.6, 7.7, 8.8]])

Отсюда до словаря легко:

In [19]: dd = {k:d for k,d in zip(data['key'], data['data'])}                   
In [20]: dd                                                                     
Out[20]: {'a': array([1.1, 2.2, 3.3, 4.4]), 'b': array([5.5, 6.6, 7.7, 8.8])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...