アプリ版:「スタンプのみでお礼する」機能のリリースについて

あるPythonのプログラムで以下のエラーが発生してしまい原因が分かりません。
部分的な情報で申し訳ありませんが、以下のエラーメッセージで推測可能な情報だけアドバイス頂けないでしょうか?
------------
Traceback (most recent call last):
File "C:\Users\test\Documents\Python\confirm.py", line 122, in <module>
main()
File "C:\Users\test\Documents\Python\confirm.py", line 99, in main
size = int(item[2]) / 1024
ValueError: invalid literal for int() with base 10:
------------
原因究明に近づけそうなら必要な情報を説明する事は可能です。
よろしくお願いいたします。

質問者からの補足コメント

  • HAPPY

    最初エラーが出たのですが、
    インデントの件に気が付き、他のソースと合わせた頭位置に半角スペースで揃えたら
    正常に動きました。
    助かりました!ありがとうございます。

    No.5の回答に寄せられた補足コメントです。 補足日時:2022/03/21 09:42

A 回答 (7件)

ftpで取得したとき、ディレクトリをスキップするようにしました。


取得した1行の3番目に<DIR>が入る前提です。
items = []
for line in lines:
  items.append(line.split())

items = []
for line in lines:
  temp = line.split()
  if temp[2] == '<DIR>':
    continue
  items.append(line.split())

のように変えてください。

注意事項:
パイソンはインデントが重要なのでインデントをつけるために
全角の空白をいれています。
このまま、コピペすると、全角文字がはいりますので、ご注意ください。
(このサイトは複数個のスペースを1つにまとめるため、インデントがおかしくなります。そのための対策です)
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。
大変助かります。
担当者に確認して修正する必要があるので後日試してみたいと思います。

お礼日時:2022/03/20 15:02

>インデントの件に気が付き、他のソースと合わせた頭位置に半角スペースで揃えたら正常に動きました。



了解しました。良かったです。
    • good
    • 0

oldというディレクトリをスキップするなら、以下のほうが良いかもしれません。


今後、old以外になにかほかのディレクトリが作成されることはないという
前提になりますが。

items = []
for line in lines:
  temp = line.split()
  if temp[3] == 'old':
    continue
  items.append(line.split())
    • good
    • 0
この回答へのお礼

フォルダ名が限定されているならこの方がシンプルで良さげですね。
でもフォルダを全てスルーさせるならNo.5の方が確実ってことですね。
ありがとうございました。

お礼日時:2022/03/20 15:00

>old というディレクトリが無ければ解決かもしれないのですが、


>このディレクトリを無視するように修正は可能でしょうか?
>必要なら改めてソースを貼ります。

ファイル一覧を取得している個所のソースをみないと判断できません。
その個所のソースを提示してください。
item[2]が気になります、itemの定義、及びそのitemへ値を格納している個所のソースもできれば、提示してください。
    • good
    • 0
この回答へのお礼

ありがとうございます!
処理的には、FTP接続先のファイル一覧を取得して、
テキスト処理してメール本文に貼ってメール送信してます。
該当箇所全体を貼ろうと思ったら、文字数制限が・・・
断片的ですみませんが貼らせて頂きます。
不足箇所があれば仰ってください。

#------------------------
# ファイル一覧取得
#------------------------
lines = []
ftp.dir(lines.append)

items = []
for line in lines:
items.append(line.split())

# ファイル名の降順。先頭から31ファイルをリストに保持。
latests = sorted(items, key=lambda x: x[3], reverse=True)[0:31]

except ftplib.all_errors as e:
print(e)
sys.exit()

#------------------------
# メール送信処理の一部
#------------------------
formatted = []
for item in latests:
# 日付(M-D-Y => Y-M-D) 07-19-21, 07-19-2021 の2パターン
parts = item[0].split('-')
year = '20' + parts[2] if len(parts[2]) == 2 else parts[2]
time = datetime.datetime.strptime(item[1], '%I:%M%p')

date = year + '-' + parts[0] + '-' + parts[1] + ' ' + time.strftime("%H:%M")

size = int(item[2]) / 1024
size = round(size, 1)
size = str(size) + 'KB'

name = item[3]
formatted.append(' '.join([name, date, size]))

message = "\n".join(formatted)

お礼日時:2022/03/20 10:53

item[2]の内容が'<DIR>'なのでint型(整数型の数値)に変換できない。


というエラーです。本来は、item[2]には'1234'とかの整数に変換可能な文字列が格納されていないといけません。
なぜ、item[2]の内容が'<DIR>'なのかは、こちらではわかりません。
もし、item[1]かitem[3]に整数に変換可能が文字列があるなら、
item[]の添え字を間違えている可能性があります。

従って、
案1:item[2]が正しいなら(itemの3番目の文字列なら)、3番目にかならず整数に変換可能な文字列が格納されるようにすること。

案2:item[1]もしくはitem[3]が正しいなら、その正しい方を使用すること。

のどちらかが対策案になります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
実は、あるディレクトリの中のファイル名一覧を取得して、
直近31ファイルのファイル名のみ抽出するプログラムです。
ファイル名の一部が日付を表しており、
確か、タイムスタンプではなく、ファイル名から読み取れる日付順に抽出していたかと思います。
エラーが出るディレクトリ内に「old」というディレクトリがありました。
エラーが出ないディレクトリには、ファイルのみでした。
このディレクトリ名を抽出してしまって日付が判断できないためにエラーになってるのではないかと推測してます。
手掛かりをいただいてありがとうございます!

old というディレクトリが無ければ解決かもしれないのですが、
このディレクトリを無視するように修正は可能でしょうか?
必要なら改めてソースを貼ります。

お礼日時:2022/03/20 09:24

エラーメッセージですが、


ValueError: invalid literal for int() with base 10:
ではなく、
ValueError: invalid literal for int() with base 10: XXX
のように表示されませんでしょうか。
もし、そうなら、XXXの箇所は何が表示されていますか。
    • good
    • 0
この回答へのお礼

大変失礼いたしました。
メモ帳が改行されているのに気づきました。
実際にはこのようになってました。

ValueError: invalid literal for int() with base 10: '<DIR>'

お礼日時:2022/03/19 16:08

エラーメッセージでググった物。



https://blog.pyq.jp/entry/Python_kaiketsu_200106

仮に

>size = int(item[2]) / 1024

がコード内にあるのなら、item[2] が10進数に変換できない(文字列とか値がないとか)のではないでしょうか?
要素番号(0から始まる点)についても気にして見直しをされてみては?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!