Я пытаюсь написать новый файл CSV, который анализирует файл большего размера и записывает только строки в соответствии с моими конкретными условиями. У меня возникла проблема с корректным выполнением моих условий, поскольку я не хочу, чтобы новая строка записывалась с «номером SKU», а «флаг запаса части» - «Y».

Я попытался обойти это, добавив еще один цикл for перед основным циклом for, который будет продолжаться через записи, если будет выполнено вышеуказанное условие.

Любая помощь приветствуется, ниже приведен код.

import csv

with open('4-22 inventory.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)

    with open ('stocking.csv', 'w', newline = '') as new_file:

        fieldnames = ['SEGMENT_CODE','WHS_NUMBER','WHS_GL_NUMBER',  'LINE_CODE',    'SUBLINE_CODE', 'PART_NBR', 'SKU_NUMBER',   'MASTER_ITEM_FLAG',
        'PART_STOCKING_FLAG',   'PART_STATUS_CODE', 'PART_MOVEMENT_CODE',   'SUB_MOVEMENT_CODE',
        'FULL_MOVEMENT_CODE',   'FACTORY_PACK_QTY', 'OH_UNIT_QTY',  'ON_ORDER_UNIT_QTY',    'UNIT_COST']

        csv_writer = csv.DictWriter(new_file, fieldnames = fieldnames)

        csv_writer.writeheader()

        for line in csv_reader:
            for lines in new_file:
                if lines['SKU_NUMBER'] and lines['PART_STOCKING_FLAG'] == 'Y':
                    continue
            if line['WHS_NUMBER'] == 'NCI' and line['PART_STOCKING_FLAG'] == 'Y':
                    csv_writer.writerow(line)
            elif line['WHS_NUMBER'] != 'NCI' and line['SKU_NUMBER'] and line['PART_STOCKING_FLAG'] == 'Y':
                True
                continue
            else:
                csv_writer.writerow(line)
0
Jonathan Fitzpatrick 29 Апр 2020 в 18:49

1 ответ

У вас проблема с формулировкой ваших условий. Состояние:

if lines['SKU_NUMBER'] and lines['PART_STOCKING_FLAG'] == 'Y':

не проверяет, что и SKU_NUMBER, и PART_STOCKING_FLAG должны равняться Y

но он проверяет, что PART_STOCKING_FLAG равно Y и SKU_NUMBER является логическим True, то есть не является пустой строкой, False, None и т. д. Так что в вашем случае будут записаны строки с PART_STOCKING_FLAG='Y', а не пустые SKU_NUMBER.

Если вы хотите проверить, что SKU_NUMBER и PART_STOCKING_FLAG являются Y, вы должны сделать:

if lines['SKU_NUMBER']== 'Y' and lines['PART_STOCKING_FLAG'] == 'Y':
    pass
0
Gabio 29 Апр 2020 в 18:55
Спасибо. На самом деле я пытаюсь проверить, что, если артикул уже существует (True) и был записан в CSV с флагом Part_Socking_Flag, равным «Y», то я не хочу, чтобы эта строка записывалась в CSV, поскольку она будет дубликатом. Моя задача состоит в том, чтобы эффективно написать это условие, чтобы мой цикл все еще анализировался без добавления SKUS, которые уже соответствуют условию «Y». Извиняюсь за путаницу.
 – 
Jonathan Fitzpatrick
29 Апр 2020 в 23:00