необходимо извлекать каждую строку из файла csv и сохранять в словаре

#python #list #csv #dictionary #tuples

#python #Список #csv #словарь #кортежи

Вопрос:

Привет всем, у меня есть файл csv, в котором мне нужно перебирать каждую строку csv, а затем сохранять в словаре с ключом и значениями,

Ключом будет заголовок CSV

например, у меня есть одно имя CSV как csv_file_data:

     sno.    val-1   val-2
      1       200      20
      2        22      44
      3        56      32
      4        32      45
 

для этого мне нужен следующий вывод:

     {'csv_file_data':[{'val-1':200,'val-2':20},{'val-1':22,'val-2':44},{'val-1':56,'val-2':32},{'val-1':32,'val-2':45}]}
 

Привет, братан,

  data_dict=[{'csvfile1_data': [{'val-1': '0', 'val-2': '0'}, {'val-1': '0', 'val-2': '0'}]}, {'csvfile2_data': [{'val-3': '138', 'val-4': '0'}, {'val-3': '0', 'val-4': '0'}]}]

 input=('input_file' [{'val-1': '100', 'val-4': '1990'}, {'val-2': '90', 'val-1': '0.0'}])
 

итак, в этом случае мне нужно заменить значения, присутствующие в input_file, на 1-й список

вывод, который мне был нужен:

  data_dict=[{'csvfile1_data': [{'val-1': '100', 'val-2': '0'}, {'val-1': '0', 'val-2': '90'}]}, {'csvfile2_data': [{'val-3': '138', 'val-4': '1990'}, {'val-3': '0', 'val-4': '0'}]}]
 

Комментарии:

1. Ваш вывод имеет тип списка, потому что вы устанавливаете output = [], что означает, что у вас есть пустой список.

2. почему бы просто не использовать csv.DictReader ?

3. @Module_art оооо хорошо, поэтому мне нужен этот список в качестве значений, а csv_file_data в качестве ключа

4. @buran Я не знаю, как использовать csv.DictReader, но спасибо, я проверю это

5. return {'csv_file_data':list_values} ?

Ответ №1:

 def get_data_csv(fn):

    mylist = []
    
    with open(fn, "r") as msg:
        for line in msg:
            mylist.append(line.strip())
        msg.close()
    
    mydict = {}
    mydict['csv_file_data'] = []
    
    headers = mylist[0].split()
    
    del mylist[0]
    
    for line in mylist:
        tmp_dict = {}
        tmp_dict[headers[1]] = int(line.split()[1])
        tmp_dict[headers[2]] = int(line.split()[2])
        mydict['csv_file_data'].append(tmp_dict)
    
    return mydict
 

Вы загружаете свои данные в список строк mylist.

Вы объявляете свой словарь и mydict['csv_file_data'] вводите пустой список.

Затем вы получаете свои заголовки из mylist[0].split() .

Поскольку вам не нужно mylist[0] , чтобы вы удаляли ее.

Вы читаете другие строки mylist , разделяете их и загружаете во временный dict с соответствующим ключом (заголовком).

Затем вы добавляете это tmp_dict в mydict .

И вы получаете:

 {'csv_file_data': [{'val-1': 200, 'val-2': 20}, {'val-1': 22, 'val-2': 44}, {'val-1': 56, 'val-2': 32}, {'val-1': 32, 'val-2': 45}]}
 

Комментарии:

1. спасибо, но я получил ошибку в этом tmp_dict[headers[1]] = line.split()[1] Ошибка индекса: список индексов вне диапазона

2. ну, я скопировал / вставил ваши данные в свой текстовый редактор и сделал это на нем. Проблем нет. Совпадают ли ваши данные с теми, которые вы опубликовали? Какой у вас текстовый редактор? Разделены ли вы пробелом, как в вашем примере?

3. Я использую pycharma, и данные csv также разные и большие, поэтому я привел пример csv

4. Хорошо, если ваш csv содержит заданное количество строк и столбцов, и если ни одно значение не пропущено, то оно должно работать. Попробуйте, возможно, .split(«,») или .split(» t»), если ваш csv разделен запятой или табуляцией вместо пробела, как в вашем примере.

5. У меня есть еще один вопрос, не могли бы вы мне помочь 🙂