#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(): // в любом случае делайте что — то с заголовком, информацией-подумайте о принятии ответа, если это было полезно.