ある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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
文字列で入力したプログラムか...
-
Makefile と <math.h>
-
perl コンストラクタへの引数
-
intel fortranのエラーで困って...
-
C# IEnumerable が IEnumerable...
-
フォートランでの記述に関して
-
typedef による2重定義
-
Mac OSX上でFortranを使いたい
-
対応する関数ヘッダーがありません
-
プロポからのパルス値解析ソー...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
String""から型'Double'への変...
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
教えて下さい
-
配列数式の解除
-
UserForm1.Showでエラーになり...
-
【プログラム】プログラミング...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
フォートランのエラーについて...
-
43:syntax error at end of input
-
intel fortranのエラーで困って...
-
C# IEnumerable が IEnumerable...
-
他クラスからForm1内コントロル...
-
Delphiでif文がうまく書けないです
-
C2065: 'EnumDisplayDevices' :...
-
DLL内からの外部変数の参照
-
構造体のポインタ参照
-
pythonの条件分岐(if)
-
ラズパイ上の、pythonのエラー...
-
Excel VABについて 下記記述が...
-
フォートラン(fortran)のエラー...
-
Excel VBA: UserForm.Show で実...
-
#ifndefとかヘッダファイルにつ...
-
DLLの使い方とerror C2146につ...
-
C言語コンパイルエラー cygwin
-
Makefile と <math.h>
-
python numpy.linalg.inv()での...
おすすめ情報
最初エラーが出たのですが、
インデントの件に気が付き、他のソースと合わせた頭位置に半角スペースで揃えたら
正常に動きました。
助かりました!ありがとうございます。