75434


下記のxlsxのデータを読み込みメールで送信したいですが、  
テキストを取得する際にxlsxに空白があるため'None'が表示されます。  
次の方法でNoneを置換してみましたが、'None'が表示されます。  
どう直せばよいのでしょうか。

code部分

[code]

    message = ''
    for row in ws["A1:C4"]:
      for col in row:
        s2 = message.replace('None', '')→Noneが表示されたら、空白として表示したい
        message += f'{col.value}\n'
    
[/code]

xlsxのデータ

[code]

     A       B     C         
    アメリカ 1234個  66.7%　 
    カナダ　 1234個　4.9%
    　 　　　1234個　5.9%
    日本　　 1234個　3.9%
    
[/code]

code全体部分

[code]

    import openpyxl
    from openpyxl.utils import column_index_from_string
    from smtplib import SMTP
    from email.mime.text import MIMEText
    from email import encoders
    from email.mime.base import MIMEBase
    from email.mime.multipart import MIMEMultipart
    import smtplib
    import codecs
    import pandas as pd
    import math
    import glob
    
    wb = openpyxl.load_workbook(copyfile,data_only=True)
    ws = wb.worksheets[10]
    
    #件名
    c2 = ws['Q5'].value
    c3 = ws['Q10'].value
    c3 =" ""¥""{:,}".format(c3)
    
    #件名
    text_c="【test"
    text_d="個"
    text_e="】"
    fusion_2= str(text_c)+str(c2)+str(text_d)+str(c3)+str(text_e)
    print(fusion_2)
    
    ##
    message = ''
    for row in ws["A1:C4"]:
      for col in row:
        s2 = message.replace('None', '')→Noneが表示されたら、空白として表示したい
        message += f'{col.value}\n'
        
    message2 = ''
    for row in ws["B1:C25"]:
      for col in row:
    　　s3 = message.replace('None', '')
        message2 += f'{col.value}\n'
    
    account = "1234"
    password = "1234"
    
    to_email = "1234"
    from_email = "1234"
    
    subject = fusion_2
    #'\n'.join(values)
    message += '\n'+message2
    print(message)
    msg = MIMEMultipart()
    msg["Subject"] = subject
    msg["To"] = to_email
    msg["From"] = from_email
    
    # メール本文
    message = MIMEText(message)
    msg.attach(message)
    
    # 添付ファイルの設定
    
    file_screen='C:\\Users\\test\\Desktop\\'
    files = glob.glob(file_screen + " テスト*.jpeg")
    print(files)
    
    
    for file in files:
        with open(file, 'rb') as f:
            file_data = f.read()
            file_name = f.name
            basename = os.path.basename(file_name)
    
            attach_file = {'name': 'テスト.jpeg', 'path': 'テスト.jpeg'} # nameは添付ファイル名。pathは添付ファイルの位置を指定
            attachment = MIMEBase('image', 'jpeg')
    
            file = open(attach_file['path'], 'rb+')
            attachment.set_payload(file.read())
    
            file.close()
            encoders.encode_base64(attachment)
            attachment.add_header("Content-Disposition", "attachment", filename=basename)
            msg.attach(attachment)
    
    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()
    server.login(account, password)
    server.send_message(msg)
    server.quit()
    
    
[/code]

わかる方いらっしゃいましたらご教示願います。  
お手数ですが、宜しくお願いいたします。


CC BY-SA 4.0
2021-04-21T11:34:07.177
75426
2021-04-21T15:59:36.637
18859
question
python excel
pythonにてopenpyxlでNoneを削除・置換


単に変換した処理結果は`s2`/`s3`に入れているのに、メール送信に使っているのは変換していない`message`/`message2`だからでしょう。

また、`for`ループの中の変換と追加の処理は逆にするか、変換処理は`for`ループを抜けた後、1度にまとめて行い、結果はそれぞれ`message`/`message2`に代入すれば良いのでは？


CC BY-SA 4.0
2021-04-21T12:28:17.777
75429
2021-04-21T12:54:47.473
2021-04-21T12:54:47.473
26370
26370
75426
answer


セルが空の場合、col.valueは`None`を返します。`"None"`という文字列ではありません。

`None`を`f'{col.value}'`で文字列化した後に、文字列置換で`"None"`を消す、というロジックはセルに`"None"`という文字列が含まれていた場合にも削除されてしまいます。明らかなバグですが、特定データのときにしか起きないのでわかりにくいやつです。あと、単純に処理が無駄です。

[code]

    for row in ws["A1:C4"]:
      for col in row:
        if col.value is None:
          message += '\n'
        else:
          message += f'{col.value}\n'
    
[/code]

のようにして「セルが空白でないときのみセルの値を結合する」という処理にするとよいでしょう。

(↑改行文字を見落としていたのでリライトしました)

またmetropolisさんのコメントのとおり、4行のifを1行にまとめて書いてしまうことができるような記法もあります。


CC BY-SA 4.0
2021-04-21T14:36:25.107
75434
2021-04-21T15:59:36.637
2021-04-21T15:59:36.637
5793
5793
75426
answer