Создание нескольких словарей с частями имени файла в качестве ключей и содержимым файла в качестве значений

#python #csv #dictionary

Вопрос:

У меня есть несколько файлов CSV, каждый из которых называется file1_OUT.csv, file2_OUT.csv […] file52_OUT.csv и т. Д. Содержимое csv-файлов выглядит следующим образом:

 | header1    | header2 |
| ---------- | ------- |
| 0.0000E 00 | ax      |
| 1.0000E 00 | ay      |
| 2.0000E 02 | bx      |
| 3.0000E 03 | by      |
| 4.0000E 03 | cx      |
| 4.0000E 01 | cy      |
| 0.0000E 00 | dx      |
| 0.0000E 00 | dy      |
 

Для каждого файла я хотел бы создать 8 словарей (ax, ay, bx, by, cx, cy, dx, dy), которые должны выглядеть следующим образом:

 ax = {'file1': 0.0000E 00, 'file2': 5.0000E 00, 'file3': 2.0000E 00 ... }
ay = {'file1': 1.0000E 00, 'file2': 0.0000E 00, 'file3': 3.0000E 00 ... }
bx = {...}
by = {...}
... 
 

Числа в словаре взяты из столбца под названием header1.

Я новичок в python, но мне удалось извлечь значения для ax, ay и т.д., Используя этот фрагмент кода:

 import os, re, csv, glob
import pandas as pd 
import numpy as np
from pathlib import Path
from os import listdir
    
for file in Path(directory).glob('*_OUT.csv'):   
        with open(file, mode='r') as inp:
            ax = df['header1'][0]
            ay = df['header1'][1]
            bx = df['header1'][2]
            by = df['header1'][3]
            cx = df['header1'][4]
            cy = df['header1'][5]
            dx = df['header1'][6]
            dy = df['header1'][7]
            print(ax, ay, bx, by, cx, cy, dx, dy)
 

К сожалению, srings называются ax, да… для каждого файла, и я думаю, что они переписаны на каждой итерации.

Кроме того, я смог извлечь имена файлов в список с помощью этого фрагмента кода:

 files_dir =  listdir(directory)
new_list = []
for names in files_dir:
    if names.endswith("_OUT.csv"):
        new_list.append(names.strip('.csv'))
print(new_list)
 

Я не уверен, насколько полезна моя попытка, так как я не могу объединить строки ax, ay, bx… со списком имен файлов и словарем имен (т. Е. Второй столбец моих входных csv-файлов). У кого-нибудь есть идея получше?

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

1. Я бы рекомендовал вместо этого импортировать все эти csv-файлы в виде таблиц SQLite

Ответ №1:

Предполагая, что ваш скрипт python находится в том же каталоге файлов, что и ваши csv — файлы, вы должны быть в состоянии сделать что-то подобное-это вернет вложенную структуру словаря с «header2» в качестве ключа в каждом случае.

 import csv
import os

# gets current working directory of the python file - if neccessary, hard type the directory with the CSVs and replace cwd below
cwd = os.getcwd()

# list comprehension to build list of target CSV files in directory
target_files = [file for file in os.listdir(cwd) if file.endswith('csv')]

# create output dictionary
file_summaries = {}

# loop over files in target list
for filename in target_files:

    # open each file
    with open(filename, 'r') as file_in:
        # pass file to built-in csv.DictReader - returns data in list of dictionaries [{}, {}]
        file_data = csv.DictReader(file_in)

        # loop over each files' data - and set default info into file summary object
        for row in file_data:
            
            file_summaries.setdefault(row['header2'], {})
            file_summaries[row['header2']].setdefault(filename, row['header1'])


# display result
print(file_summaries)
 

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

1. Спасибо вам за ваш ответ! Похоже, что отправленный вами код выполняется без ошибок, но, к сожалению, он создает только пустой словарь.

2. я предполагаю, что вы не просматриваете какие-либо файлы ? печать(target_files), чтобы подтвердить, что вы действительно обрабатываете / открываете какие-либо данные.

3. Теперь это работает очень хорошо 🙂 Большое вам спасибо! Я создал вложенный словарь, используя предложенный вами код. Позже в своем коде я просто использую «file_summaries.pop» для индивидуальной обработки данных, т. е. ax, ay, bx, by и т. Д.

4. нет необходимости использовать pop — идентификатор для заголовка, информация в file_summaries.items(): // в любом случае делайте что — то с заголовком, информацией-подумайте о принятии ответа, если это было полезно.