Yahooショッピングで複数の商品に共通の画像を使いたい人への時短コード

どう書いたら伝わるのか。

Yahooショッピングの画像登録って

メイン画像:aaa.jpg
サブ画像:aaa_1.jpg , aaa_2.jpg

みたいにして上げたら反映されます。

じゃあaaa.jpg , bbb.jpg ,ccc.jpg とあって、それぞれのサブ画像は共通でやりたい場合はどうするの

同じ内容の画像をaaa_1.jpg , bbb_1.jpg・・・とコピーして名前変えてアップしたらいけます。
手作業なんてやってられん。

多分URL指定するとか、YahooProショッピング内でブラウザから指定したら使いまわせるけれど。
面倒がすぎる。同じく手作業じゃん。むりむり

CSVで指定出来たらいいんだけどどこからやるのか分からん。

API使えればいいんだけれど、Yahooさんのシステムがアクセストークンの取り方やらややこしい・・
クライアントIDとかもう名前からあんまり一般的じゃない気がする。とりあえずややこしい。

ってことで上手くやれる人はやればいいんですが、力業で解決するコードです。
時短にはなるはず。

コードの目的

前提として

商品 ギター1 ギター2 とします。

サブ画像common01 , common02 , common03 ・・・はギター1,ギター2で同じものを使いたい
バリエーションは組んでない

という状況とします。

このサブ画像を
common01→ギター1_1 , ギター2_1
common02→ギター1_2 , ギター2_2
みたくリネームして複製していくことが目的です。

あと無駄に画像が大きくても困るので、幅1000pxにリサイズします。

コード

JupytersLabやらにコピペして使ってください。pythonです。

#メイン画像以外の2枚目医工の画像をサブ画像と呼ぶ

#処理したい画像を全て1つのフォルダに入れる。フォルダの変数はsrc_folder
#aaa.jpgのメイン画像もaaa_1.jpgのようなサブ画像も全て入れる
#サブ画像はcomon01.jpg~comon99.jpgの名称にする。変更したければコード内のcomonを変更
#実行するとsrc_folder内のdstフォルダにaaa.jpg、aaa_1.jpgのような名称で幅1000pxに変換して出力される

##Excelファイルの説明
#ファイルはA列にYahooのCODE(出力したいaaaa.jpgのaaaaの部分)、B列にファイル名(bbbb.jpgならbbbb)を入れる
#関数等で-を消す、何文字か切り出している等の場合はファイル名を抽出できないことがあるので、文字列で入力しておく
#src_folderの中にExcelファイルを保存する
#jpgファイルがあって処理された場合はD列に1、ファイルがなかった場合はD列に0が入力される

#以下3点を指定

##設定部分
#1src_folderを指定する
src_folder = "D:\\photoshop_output\\seasta\\data230304\\wax\\11mmスティック"

#2処理内容が書かれたファイルの名称を指定する。拡張子まで含めて、bbb.xlsxのように指定する。
CodeNamefile = "code_for_pics_wax.xlsx"

#3 共通で利用するファイルに利用する名称を指定。標準のcomonなら、comon01~comon99で実際のファイルを作る。
#commonが正しかったと気づいたときには修正が面倒だったのでご愛敬
subfilename = "comon"

#以下はエラー時に対処
import os
import shutil
import openpyxl
from PIL import Image

#フォルダ名の調整と作成
if src_folder[-2:] != "\\":
    src_folder += "\\"
if not os.path.exists(src_folder + "dst\\"):
    os.makedirs(src_folder + "dst\\")
dst_folder = src_folder + "dst\\"


# yahooのコードとファイル名を入れたシートを開く
# 商品コードをA列、ファイル名をB列にする
WB = src_folder + CodeNamefile
wb = openpyxl.load_workbook(WB)
ws = wb.active

# 最大行を取得する
max_row = ws.max_row


#1行目はタイトルとする
for row in range(2, max_row + 1):
    # B列を読み込み、変数nameとする
    filename = ws.cell(row=row, column=2).value
    # A列を読み込み、変数codeとする
    code = ws.cell(row=row, column=1).value
#    if code is not None and filename is not None:
        # name+".jpg"をfolderから探してコピーする
    src_file = src_folder + filename + '.jpg'
    dst_file = dst_folder + code + '.jpg'

    if os.path.exists(src_file):
            # name+".jpg"がある場合はD列に1を入力する
        ws.cell(row=row, column=4).value=1
        # 画像の横幅をリサイズする
        img_path = src_file
        Image.open(img_path).convert('RGB').save(img_path)
        img = Image.open(img_path)
        w, h = img.size
        new_w = 1000
        new_h = int((new_w / w) * h)
        img_resized = img.resize((new_w, new_h), Image.LANCZOS)
        img_resized.save(img_path)
    # name+".jpg"をcode+".jpg"としてリネームしてペーストする
        dst_file = dst_folder + code + '.jpg'
        shutil.copy(src_file, dst_file)
        
        #comonファイルの数を数える
        count = 0  # 「comon」で始まるファイルの数をカウントする変数を初期化する

        for filename in os.listdir(src_folder):
            if filename.startswith(subfilename):
                count += 1
                
        subpic = count

        # comonファイルをコピーしてペーストする
        for i in range(1, subpic+1):
                src_file = src_folder + 'comon{:02d}.jpg'.format(i)
                dst_file = dst_folder + '{}_{}.jpg'.format(code, i)
                img_path = src_file
                Image.open(img_path).convert('RGB').save(img_path)
                img = Image.open(img_path)
                w, h = img.size
                new_w = 1000
                new_h = int((new_w / w) * h)
                img_resized = img.resize((new_w, new_h), Image.LANCZOS)
                img_resized.save(img_path)
            # name+".jpg"をcode+".jpg"としてリネームしてペーストする
                shutil.copy(src_file, dst_file)
    else:
        # name+".jpg"がない場合はD列に0を入力する
        ws.cell(row=row, column=4).value=0

# Excelファイルを保存して閉じる
wb.save(WB)
wb.close()

サブ画像用コピーコードの補足と注意点

作るエクセルはA列がヤフーの商品CODE、B列がメイン画像のファイル名

商品コードと同じ名前で画像作ってるなら、同じ内容が入ります。

列や行変えたい人は

# B列を読み込み、変数nameとする
filename = ws.cell(row=row, column=2).value
# A列を読み込み、変数codeとする
code = ws.cell(row=row, column=1).value

ここのcolumn変えてください。

1行目タイトルにしてますが、タイトル要らねぇって人は

#1行目はタイトルとする
for row in range(2, max_row + 1):

ここを2スタートじゃなくて1スタートにしてください。

出力した後どうするの

25MB以下のZIPにまとめて、その後は手作業でアップ

25MB以下にまとめる方法はこっちのコード使えば作れます。

タイトルとURLをコピーしました