ある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:
------------
原因究明に近づけそうなら必要な情報を説明する事は可能です。
よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
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つにまとめるため、インデントがおかしくなります。そのための対策です)
No.6
- 回答日時:
oldというディレクトリをスキップするなら、以下のほうが良いかもしれません。
今後、old以外になにかほかのディレクトリが作成されることはないという
前提になりますが。
items = []
for line in lines:
temp = line.split()
if temp[3] == 'old':
continue
items.append(line.split())
フォルダ名が限定されているならこの方がシンプルで良さげですね。
でもフォルダを全てスルーさせるならNo.5の方が確実ってことですね。
ありがとうございました。
No.4
- 回答日時:
>old というディレクトリが無ければ解決かもしれないのですが、
>このディレクトリを無視するように修正は可能でしょうか?
>必要なら改めてソースを貼ります。
ファイル一覧を取得している個所のソースをみないと判断できません。
その個所のソースを提示してください。
item[2]が気になります、itemの定義、及びそのitemへ値を格納している個所のソースもできれば、提示してください。
ありがとうございます!
処理的には、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)
No.3
- 回答日時:
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]が正しいなら、その正しい方を使用すること。
のどちらかが対策案になります。
ありがとうございます。
実は、あるディレクトリの中のファイル名一覧を取得して、
直近31ファイルのファイル名のみ抽出するプログラムです。
ファイル名の一部が日付を表しており、
確か、タイムスタンプではなく、ファイル名から読み取れる日付順に抽出していたかと思います。
エラーが出るディレクトリ内に「old」というディレクトリがありました。
エラーが出ないディレクトリには、ファイルのみでした。
このディレクトリ名を抽出してしまって日付が判断できないためにエラーになってるのではないかと推測してます。
手掛かりをいただいてありがとうございます!
old というディレクトリが無ければ解決かもしれないのですが、
このディレクトリを無視するように修正は可能でしょうか?
必要なら改めてソースを貼ります。
No.2
- 回答日時:
エラーメッセージですが、
ValueError: invalid literal for int() with base 10:
ではなく、
ValueError: invalid literal for int() with base 10: XXX
のように表示されませんでしょうか。
もし、そうなら、XXXの箇所は何が表示されていますか。
大変失礼いたしました。
メモ帳が改行されているのに気づきました。
実際にはこのようになってました。
ValueError: invalid literal for int() with base 10: '<DIR>'
No.1
- 回答日時:
エラーメッセージでググった物。
https://blog.pyq.jp/entry/Python_kaiketsu_200106
仮に
>size = int(item[2]) / 1024
がコード内にあるのなら、item[2] が10進数に変換できない(文字列とか値がないとか)のではないでしょうか?
要素番号(0から始まる点)についても気にして見直しをされてみては?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby パイソンエラーについて 1 2022/12/24 14:07
- その他(IT・Webサービス) Pythonのcomet_mlに関する質問です。 1 2021/11/27 09:39
- Ruby 教えてください 2 2023/01/04 17:50
- その他(プログラミング・Web制作) pythonのエラーについて 2 2022/08/17 17:17
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- オープンソース stable diffusionのインストールがうまくいきません。 1 2023/06/20 13:09
- Ruby pythonエラー 4 2022/11/11 19:12
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- その他(プログラミング・Web制作) pythonをjupiter notebookからmecabで頻出の高い単語の抽出について(Runt 1 2022/12/17 18:08
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python numpy.linalg.inv()での...
-
End Sub が必要です。
-
fortran 配列宣言のオーバーフ...
-
intel fortranのエラーで困って...
-
フォートランのエラーについて...
-
対応する関数ヘッダーがありません
-
C# IEnumerable が IEnumerable...
-
VBでエラー'ActiveX component ...
-
Excel VBA: UserForm.Show で実...
-
Obj-C の@property
-
コンパイルで未定義のシンボル
-
解説サイトに従ったfortran並列...
-
Python プログラムでのエラー
-
他クラスからForm1内コントロル...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
配列数式の解除
-
メッセージボックスのOKボタ...
-
UserForm1.Showでエラーになり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
intel fortranのエラーで困って...
-
C言語のプログラムが実行できま...
-
対応する関数ヘッダーがありません
-
Excel VABについて 下記記述が...
-
VBでエラー'ActiveX component ...
-
他クラスからForm1内コントロル...
-
Makefile と <math.h>
-
VB.NETのStructureの使い方を教...
-
43:syntax error at end of input
-
フォートラン(fortran)のエラー...
-
AccessVBAでVLookupを使いたい
-
(fortran) run-time erro M620...
-
解説サイトに従ったfortran並列...
-
verilogでデマルチプレクサの作...
-
Excel VBA: UserForm.Show で実...
-
構造体のポインタ参照
-
【ルネサスのマイコン】E8aから...
-
typedef による2重定義
おすすめ情報
最初エラーが出たのですが、
インデントの件に気が付き、他のソースと合わせた頭位置に半角スペースで揃えたら
正常に動きました。
助かりました!ありがとうございます。