Вопрос или проблема
Я довольно новичок в Python и пытаюсь создать приложение, где я беру основной файл с информацией о продуктах и сравниваю его с более старым файлом данных с теми же данными.
Цель приложения заключается в выделении любых новых продуктов с использованием столбца ‘SKU’ и затем в создании нового файла, который будет содержать все те же столбцы из основного файла, но только строки с ‘новыми’ продуктами.
Описание файлов:
“downloaded_data.csv” – это главный файл, который загружается с URL.
“current-data.csv” – это старый файл данных для сравнения с целью найти новые продукты.
“new-products.csv” – это файл, который будет создан и который будет содержать только новые продукты, которые появляются в основном файле после сравнения с текущим файлом данных (current-data.csv). Этот новый файл должен также включать все столбцы, которые появляются в основном файле (downloaded_data.csv).
“comparison-file.csv” – это файл, который просто выводит список SKU, которые считаются новыми.
Примеры столбцов из файла “downloaded_data.csv”, которые также должны появиться в новом файле.
Название | URL изображения | SKU |
---|---|---|
Название продукта Один | imageurl.jpg | SKU123 |
Название продукта Два | imageurl.jpg | SKU456 |
Ниже мой код на Python. После его выполнения файл “new-products.csv” оказывается просто копией загруженного основного файла.
import pandas as pd
import requests
pd.set_option("display.max_rows", None)
# Загрузка CSV файла
url = "URL ЗДЕСЬ"
response = requests.get(url)
# Проверка, успешен ли запрос (код состояния 200)
if response.status_code == 200:
# Сохранение содержимого ответа в локальный CSV файл
with open("downloaded_data.csv", "wb") as f:
f.write(response.content)
print("CSV файл успешно загружен")
else:
print("Не удалось загрузить csv файл. Код состояния: ", response.status_code)
# Чтение CSV файла в Pandas DataFrame
master_file_compare = pd.read_csv("downloaded_data.csv", usecols=[29], names=['SKU'])
account_data = pd.read_csv("account-data.csv", usecols=[5], names=['SKU'])
# Объединение обоих датафреймов с использованием левого объединения
comparison_result = pd.merge(master_file_compare, account_data, on='SKU', how='left', indicator=True)
# Фильтрация только строк, доступных слева (master_file_compare)
comparison_result = comparison_result.loc[comparison_result['_merge'] == 'left_only']
comparison_result.to_csv('comparison-file.csv', encoding='utf8')
# Сравнение файла сравнения с мастером и генерация файла данных
with open('downloaded_data.csv', 'r', encoding='utf8') as in_file, open('new-products.csv', 'w', encoding='utf8') as out_file:
for line in in_file:
if line.split(',')[0].strip() not in comparison_result:
out_file.write(line)
# print(account_data.head)
print(comparison_result)
Следует отметить, что текущие данные (файл сравнения) не будут иметь таких же столбцов или даже порядка столбцов. Все, что я пытаюсь сделать, это сопоставить столбцы SKU, так как они являются идентификаторами.
Любые указания или предложения, на чем сосредоточиться дальше, будут высоко оценены.
Спасибо!
Ответ или решение
Теория
Python предоставляет множество мощных библиотек для работы с данными, что делает его идеальным выбором для задач, связанных с анализом и обработкой информации. В частности, для работы с электронными таблицами и CSV-файлами часто используют библиотеку Pandas, которая позволяет эффективно обрабатывать и анализировать крупные объемы данных, включая такие операции, как фильтрация, сортировка и объединение таблиц.
Ваша задача заключается в сравнении двух CSV-файлов ("downloaded_data.csv" и "current-data.csv") для выявления новых продуктов по уникальному идентификатору SKU и последующем создании нового файла "new-products.csv", содержащего только новые позиции. Для успешного выполнения этой задачи необходимо следовать четкой логике: идентифицировать новые строки на основе отсутствия их в старом файле, а затем сохранить соответствующие свечи в новом файле.
Пример
Давайте рассмотрим пример пошагово, чтобы понять, как можно реализовать задачу используя Python и Pandas:
-
Загрузка и парсинг файлов:
Используйте библиотекуrequests
для загрузки файла с заданного URL и сохраните его на локальный диск. После этого с помощьюPandas
прочтите оба файла в DataFrame для последующего анализа. -
Сравнение файлов:
Используйте функциюmerge
для объединения таблиц по колонкеSKU
. Опцияindicator=True
в методеmerge
позволяет вам узнать, откуда происходит каждая строка: из левого, правого или обоих файлов. Это позволяет легко выделить новые элементы, которые есть в новом файле, но отсутствуют в старом. -
Фильтрация данных:
После объединения данных вы можете отфильтровать строки с помощью условия_merge == 'left_only'
, чтобы изолировать новые SKU. -
Сохранение результата:
После того как вы отфильтровали новые элементы, сохраните их в новый CSV файл с полным набором данных, используяto_csv()
.
Применение
Давайте теперь применим данную теорию на практике, исправив ваш код:
import pandas as pd
import requests
# Загрузка CSV файла
url = "URL_GOES_HERE"
response = requests.get(url)
if response.status_code == 200:
with open("downloaded_data.csv", "wb") as f:
f.write(response.content)
print("CSV file downloaded successfully")
else:
print("Failed to download csv file. Status code: ", response.status_code)
# Чтение CSV файлов в DataFrame
master_data = pd.read_csv("downloaded_data.csv")
current_data = pd.read_csv("current-data.csv")
# Объединение таблиц по колонке 'SKU'
merged_data = pd.merge(master_data, current_data, on='SKU', how='left', indicator=True)
# Фильтрация новых товаров
new_products = merged_data[merged_data['_merge'] == 'left_only'].drop(columns=['_merge'])
# Сохранение списка новых SKU
new_skus = new_products['SKU'].tolist()
pd.DataFrame(new_skus, columns=['SKU']).to_csv('comparison-file.csv', index=False)
# Сохранение новых продуктов
new_products.to_csv('new-products.csv', index=False)
print("Файл 'new-products.csv' с новыми продуктами успешно создан.")
Заключение
Ключевой аспект этой задачи — правильное использование функций объединения и фильтрации в Pandas
. В приведенном выше решении мы пересекли два набора данных, использовали индикаторы для определения новых строк и сохранили только те продукты, которые являются новыми. Этот метод отличается эффективностью и простотой, что особенно важно в сценариях работы с большими данными.
Ваш проект теперь способен корректно обрабатывать информацию и вносить изменения в файлы CSV, помогая вам автоматизировать мониторинг новых продуктов. Важно помнить о регулярных тестах и проверки корректности данных, чтобы удостовериться в надежности такого решения в реальных условиях.