У меня есть два файла 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)
Каждый раз, когда вы вызываете getMarginDict, вы используете with open(csvFilePathIMS, encoding='utf-8-sig') as csvf:
для открытия и чтения CSV-файла. Поскольку это менеджер контекста, файл автоматически закрывается, когда вы выходите из области действия оператора «with open…».
Похоже, вы намеревались открыть файл один раз и прочитать его построчно. Для этого вы можете открыть файл с помощью csvReaderGR = csv.DictReader(open(csvFilePathIMS, encoding='utf-8-sig'))
и использовать этот экземпляр повторно.
Возможно, здесь есть недоразумение. Вы должны открыть файл вне getMarginDict, чтобы он оставался открытым, а затем передать необходимую информацию о файле своим функциям.
Если вы откроете файл внутри функции, то файл будет автоматически закрыт в конце функции, подобно "при открытии".
Ах. Теперь имеет смысл иметь open снаружи функции getMarginDict. Попробовал, теперь не перезагружается. Мне просто нужно внести несколько изменений в код, потому что мне нужно создать дубликаты объектов JSON с увеличением ключа Name. Я думаю, что я хорошо отсюда. Ценить. :)
Я вызвал ваш ответ. Если вы не возражаете против моего вопроса, я хотел бы этого. :) @mandias спасибо
Если это ответило на ваш вопрос, то обычно нужно нажать на галочку, чтобы принять его в качестве ответа.
ценим обратную связь. Я использовал csvReaderGR для прокрутки, но, похоже, он все еще продолжает возвращаться к началу. Какие-либо предложения? @Мадиас