Соответствие определенных значений из отдельных файлов CSV и объединение строк

Я пытаюсь создать программу python v3.x, которая смотрит на 2 файла CSV.
Первоначально мне нужно разделить список CSV CAR на 2 списка, дорогие автомобили и дешевые автомобили и назначить соответствующие строки каждому.

Затем я планирую взять индикатор из CSV индикатора, увидев, является ли он индикатором, характерным для дорогого автомобиля, дешевого автомобиля или для обоих, и затем объединяет значения из этой строки индикатора CSV с соответствующей строкой в ??автомобиле CSV.

  1. CAR CSV - список деталей на нескольких автомобилях

    «Car Code», «Price», «Alias», «Группы»
    «Car1», «100», «Blue Car», «Cheap Cars»,
    «Car2», «900», «Gold Car», «Дорогие автомобили»,
    «Car3», «150», «Красный автомобиль», «Недорогие автомобили»
    «Car4», «999», «Платиновая машина», «Дорогие автомобили»
    «Car5», «122», «Браун-кар», «Недорогие автомобили» «
    Car6», «500», «Розовый автомобиль», «Недорогие автомобили», «Дорогие автомобили»,

  2. Индикатор CSV - отображает возможные ошибки / ошибки с автомобилями

    «Indicator_Field», «Indicator_Value», «Desc», «Groups»
    «Fault», «Rusting», «Bodywork rusting», «Cheap Cars», «Дорогие автомобили»,
    «Ошибка», «Window Winder Stopped», «Ручная размотка окна» сломанные»,„Дешевые автомобили“
    „Неисправность“,„Проблемы V12“,„V12 Проблемы двигателя“,„дорогие автомобили“

  3. Конкатенированные примеры

    {"code": "Car1", "Error": "Rusting"}
    {"code": "Car2", "Fault": "V12 Issues"}
    {"code": "Car5", "Error": "Window Winder Stopped "}
    {" code ":" Car1 "," Error ":" Window Winder Stopped "}

Пока все, что мне удалось сделать, это выбрать случайную строку из каждого CSV и объединить определенные значения из каждого. Проблема в том, что теперь все показатели и группы автомобилей совпадают.

from sys import argv
from time import sleep
import random
import csv
import heapq

script, indicator_file, car_file = argv
ind = ''
car = ''

def indicatorDefinition(i):
    with open(i) as file:
        reader = csv.DictReader(file)
        random_line, = heapq.nlargest(1, reader, key=lambda L: random.random())
        global ind
        ind = random_line['Indicator_Field']+'":"'+random_line['Indicator_Value']+'"'

def carDefinition(n):
    with open(n) as file:
        reader = csv.DictReader(file)
        random_line, = heapq.nlargest(1, reader, key=lambda L: random.random())
        global net
        net = '"code":"'+random_line['Car code']+'","'




def counter():
    count = 0
    while count < 6:
        carDefinition(car_file)
        indicatorDefinition(indicator_file)
        print("{"+car+ind+"}")
        sleep(random.randint(1,10))
        count += 1


counter()

python,python-3.x,csv,

0

Ответов: 1


0 принят

Что-то вроде этого, может быть? Я предположил, что поле «Группы» должно быть разделено и не использоваться как «есть». Обновлено в соответствии с комментариями для чтения всех групп.

import csv
import io
import random
import collections
import itertools

# Data included in source for clarity

car_csv = """
"Car code","Price","Alias","Groups"
"Car1","100","Blue Car","Cheap Cars"
"Car2","900","Gold Car","Expensive Cars"
"Car3","150","Red Car","Cheap Cars"
"Car4","999","Platinum Car","Expensive Cars"
"Car5","122","Brown Car","Cheap Cars"
"Car6","500","Pink Car","Cheap Cars","Expensive Cars"
"TestCarWithThreeGroups","500","Pink Car","Cheap Cars","Expensive Cars","Broken Cars"
""".lstrip()

indicator_csv = """
"Indicator_Field","Indicator_Value","Desc","Groups"
"Fault","Rusting","Bodywork is rusting","Cheap Cars; Expensive Cars"
"Error","Window Winder Stopped","Manual window winder broken","Cheap Cars"
"Fault","V12 Issues","V12 Engine Problems","Expensive Cars"
""".lstrip()

# Read data (replace io.StringIO(...) with a file object to read from a file)
indicator_data = list(csv.DictReader(io.StringIO(indicator_csv)))

# Note `restkey` to capture all of the additional columns into `OtherGroups`.
car_data = list(csv.DictReader(io.StringIO(car_csv), restkey='OtherGroups'))

# Pre-massage the car data so `Groups` is always a set of groups, and `OtherGroups` is no longer there:
for car in car_data:
    car['Groups'] = {car['Groups']} | set(car.pop('OtherGroups', ()))


# Create a mapping of groups <-> indicators
indicators_by_group = collections.defaultdict(list)
for indicator in indicator_data:
    for group in indicator['Groups'].split('; '):
        indicators_by_group[group].append(indicator)


def generate_car():
    car = random.choice(car_data)
    # Concatenate all indicators based on the groups of the car
    available_indicators = list(itertools.chain(
        *(indicators_by_group.get(group, []) for group in car['Groups'])
    ))
    # Choose a random indicator -- this will crash if there are no available indicators
    # for the car.
    indicator = random.choice(available_indicators)
    # Generate output datum
    return {
        'code': car['Car code'],
        indicator['Indicator_Field']: indicator['Indicator_Value'],
    }


for x in range(10):
    print(generate_car())

Пример вывода:

{'code': 'Car1', 'Error': 'Window Winder Stopped'}
{'code': 'Car6', 'Error': 'Window Winder Stopped'}
{'code': 'Car2', 'Fault': 'Rusting'}
{'code': 'Car6', 'Error': 'Window Winder Stopped'}
{'code': 'TestCarWithThreeGroups', 'Error': 'Window Winder Stopped'}
{'code': 'Car5', 'Fault': 'Rusting'}
{'code': 'Car2', 'Fault': 'Rusting'}
{'code': 'TestCarWithThreeGroups', 'Fault': 'V12 Issues'}
{'code': 'Car6', 'Fault': 'Rusting'}
{'code': 'TestCarWithThreeGroups', 'Error': 'Window Winder Stopped'}
питон, питон-3.x, CSV,
Похожие вопросы
Яндекс.Метрика