Возникли проблемы с обработкой двух файлов csv с разными идентификаторами в каждом файле с помощью json python

У меня есть два файла csv, которые я хотел бы открыть и получить уникальный идентификатор из обоих файлов csv. У каждого идентификатора есть определенные даты, которые я хотел бы получить и вычесть эти даты. Проблема в том, что мне нужно получить одну дату из одного CSV, а другую дату из другого CSV. В обоих файлах csv есть некоторые данные, которые мне не нужны, поэтому в своем коде я создал новые словари, извлек эти даты из двух файлов csv и выгрузил их в новый файл JSON. Я хотел бы отметить, что в одном файле csv уникальные идентификаторы сгруппированы ближе к середине файлов csv, а другие уникальные идентификаторы сгруппированы ближе к концу, поэтому при запуске кода я заметил, что код продолжает перезапускаться обратно к началу csv и не продолжает проверять уникальный идентификатор в файлах csv.

Код работает с функцией make_json(), которая получает нужные мне данные и вычитает две даты из CSV, а затем выгружает их в файл JSON. Другая функция с именем getMarginDict() берется из другого CSV-файла, в котором также есть даты. Единственная разница в том, что даты, которые мне нужно вычесть, находятся в другом файле CSV. Мне нужно получить даты из csv1 и вычесть даты из csv2, но, как упоминалось выше, код продолжает обработку вверху. Я считаю, что это потому, что файл снова открывается. Есть ли способ, чтобы код продолжил обработку уникальных идентификаторов с того места, где он остановился. Наконец, код работает при проверке первого уникального идентификатора, но затем перезапускается.

Вот как выглядит окончательный файл JSON: Как вы можете видеть, последние три поля под названием «Новая дата» вычисляются неправильно, а первые два — правильно.

{"Name": "1", "Unique ID": "1357", "Date Finish": "06/19/2024", "Date Completed": "06/19/2024", "Date Left": 775, "Date Completed-Today's Date": 775, "New Date": 43}
{"Name": "2", "Unique ID": "1357", "Date Finish": "06/19/2024", "Date Completed": "06/19/2024", "Date Left": 775, "Date Completed-Today's Date": 775, "New Date": 43}
{"Name": "3", "Unique ID": "7531", "Date Finish": "12/25/2024", "Date Completed": "12/25/2024", "Date Left": 964, "Date Completed-Today's Date": 964, "New Date": -146}
{"Name": "4", "Unique ID": "7531", "Date Finish": "12/25/2024", "Date Completed": "12/25/2024", "Date Left": 964, "Date Completed-Today's Date": 964, "New Date": -146}
{"Name": "5", "Unique ID": "7531", "Date Finish": "12/25/2024", "Date Completed": "12/25/2024", "Date Left": 964, "Date Completed-Today's Date": 964, "New Date": -146}


data = {}
newData = []
marginData = {}

def incrementSV(data,x):
    data["Name"] = str(x)
    return x

    
def createNewDict(data, IDNum, endDate, latefinish, diffBaseline, diffLateFinish):
    return data, IDNum, endDate, latefinish, diffBaseline, diffLateFinish

def createNewDict(data, IDNum, endDate, latefinish, diffBaseline, diffLateFinish):
    data["Unique ID"] = IDNum
    data["Date Finish"] = endDate
    data["Date Completed"] = latefinish
    data["Days Left"] = diffBaseline.days
    data["Date Completed-Today's Date"] = diffLateFinish.days

def getMarginDict(endDateNew):
        with open(csvFilePathIMS, encoding='utf-8-sig') as csvf:
            csvReaderGR = csv.DictReader(csvf)
            for newsRows in csvReaderGR:
          
                uuid = newsRows["Unique ID"]
                laterDate= newsRows["Finish"]
                
                laterDateNew= datetime.datetime.strptime(laterDate, '%m/%d/%Y')
                dateNew= laterDateNewNew.date() - endDateNew9.date()

                if int(uuid) == 1234:
                    marginData["New Date"] = dateNew.days
                    return marginData
                
                elif int(uuid) == 4321:
                    marginData["New Date"] = dateNew.days
                    return marginData


def make_json(csvFilePath,jsonFilePath):
    es = Elasticsearch("localhost",) 
    # Open a csv reader called DictReader
    with open(csvFilePath, encoding='utf-8-sig') as csvf:
        csvReader = csv.DictReader(csvf)
        # Convert each row into a dictionary
        # and add it to data
        for rows in csvReader:
            IDNum = rows['Unique ID']
            endDate = rows['End Date']
            latefinish = rows['Date Completed']   
            
            endDateNew= datetime.datetime.strptime(endDate, '%m/%d/%Y')
            diffBaseline = endDateNew.date() - datetime.date.today()

            newLatefinishDate = datetime.datetime.strptime(latefinish, '%m/%d/%Y')
            diffLateFinish = newLatefinishDate.date() - datetime.date.today()
            
            imsData = partial(createNewDict, data, IDNum, endDate, latefinish, diffBaseline, diffLateFinish)
            
            if int(IDNum) == 1357:
                for x in range(1,3):
                    incrementSV(data,x)
                    imsData()
                    getMarginDict(endDateNew)
                    totalIMS = dict(data, **marginData)
                    newData.append(dict(totalIMS))
                    
            elif int(IDNum) == 7531:
                for x in range(3,6):
                    incrementSV(data,x)
                    imsData()
                    getMarginDict(endDateNew)
                    totalIMS = dict(data, **marginData)
                    newData.append(dict(totalIMS))
           

    with open(jsonFilePath, 'w', encoding='utf-8') as jsonf:
        for item in newData:
            x = json.dump(item,jsonf)
            jsonf.write('\n')

csvFilePath = "location of 1st csv file"
jsonFilePath = "location of JSON file"

csvFilePathIMS = 'location of 2nd csv file'

# Call the make_json function
make_json(csvFilePath,jsonFilePath)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждый раз, когда вы вызываете getMarginDict, вы используете with open(csvFilePathIMS, encoding='utf-8-sig') as csvf: для открытия и чтения CSV-файла. Поскольку это менеджер контекста, файл автоматически закрывается, когда вы выходите из области действия оператора «with open…».

Похоже, вы намеревались открыть файл один раз и прочитать его построчно. Для этого вы можете открыть файл с помощью csvReaderGR = csv.DictReader(open(csvFilePathIMS, encoding='utf-8-sig')) и использовать этот экземпляр повторно.

ценим обратную связь. Я использовал csvReaderGR для прокрутки, но, похоже, он все еще продолжает возвращаться к началу. Какие-либо предложения? @Мадиас

alphanumEric 06.05.2022 19:49

Возможно, здесь есть недоразумение. Вы должны открыть файл вне getMarginDict, чтобы он оставался открытым, а затем передать необходимую информацию о файле своим функциям.

Mandias 06.05.2022 20:00

Если вы откроете файл внутри функции, то файл будет автоматически закрыт в конце функции, подобно "при открытии".

Mandias 06.05.2022 20:19

Ах. Теперь имеет смысл иметь open снаружи функции getMarginDict. Попробовал, теперь не перезагружается. Мне просто нужно внести несколько изменений в код, потому что мне нужно создать дубликаты объектов JSON с увеличением ключа Name. Я думаю, что я хорошо отсюда. Ценить. :)

alphanumEric 06.05.2022 20:52

Я вызвал ваш ответ. Если вы не возражаете против моего вопроса, я хотел бы этого. :) @mandias спасибо

alphanumEric 06.05.2022 20:56

Если это ответило на ваш вопрос, то обычно нужно нажать на галочку, чтобы принять его в качестве ответа.

Mandias 07.05.2022 05:31

Другие вопросы по теме