質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

6653閲覧

expected str, bytes or os.PathLike object, not intのエラーについて

aspara

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/03 14:41

前提

pythonで選択したディレクトリ内のファイル名の頭に任意の文字を追加するというのを作ろうとしています
uiはできているのですがMain関数のfor文内でのエラーを修正できず困っています

発生している問題・エラーメッセージ

Main関数のfor文内name=の行でエラーが出ています

TypeError: expected str, bytes or os.PathLike object, not int

該当のソースコード

python

1import os,sys 2import glob 3import tkinter as tk 4from tkinter import filedialog 5 6def dirdialog(): 7 global iDirPath 8 iDir = os.path.abspath(os.path.dirname(__file__)) 9 iDirPath = filedialog.askdirectory(initialdir = iDir) 10 entry1.set(iDirPath) 11 12def Main(): 13 global iDirPath,cnt,paths,NameEntry 14 print(iDirPath) 15 temp_path=str(iDirPath) 16 paths = glob.glob(temp_path+"/*") 17 print(paths) 18 for p in range(len(paths)): 19 name = os.path.splitext(os.path.basename(p))[0] 20 print(name) 21 new_file_name=NameEntry,name 22 print(new_file_name) 23 os.rename(os.path.join(iDirPath,paths[p]),os.path.join(iDirPath+new_file_name)) 24 25root=tk.Tk() 26root.title("name changer") 27cvs=tk.Canvas(root,width=400,height=200) 28cvs.pack() 29 30IDirLabel = tk.Label(text="フォルダ参照→") 31IDirLabel.place(x=0,y=10) 32 33entry1 = tk.StringVar() 34IDirEntry = tk.Entry(textvariable=entry1, width=40) 35IDirEntry.place(x=80,y=10) 36 37IDirButton = tk.Button(text="参照",width=5,height=1,command=dirdialog) 38IDirButton.place(x=350,y=7) 39 40NameLabel = tk.Label(text="名前") 41NameLabel.place(x=45,y=80) 42 43entry2 = tk.StringVar() 44NameEntry = tk.Entry(textvariable=entry2, width=10) 45NameEntry.place(x=80,y=80) 46 47button1 = tk.Button(text="実行",width=5,height=1,command=Main) 48button1.place(x=200,y=170) 49 50button2 = tk.Button(text=("閉じる"),width=5,height=1,command=quit) 51button2.place(x=250,y=170) 52 53root.mainloop() 54

試したこと

エラーについて調べてみましたがよくわからずこちらに質問させていただきました。

補足情報(FW/ツールのバージョンなど)

python 3.7.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Python

1for p in range(len(paths)): 2 name = os.path.splitext(os.path.basename(p))[0] 3 print(name) 4 new_file_name=NameEntry,name 5 print(new_file_name) 6 os.rename(os.path.join(iDirPath,paths[p]),os.path.join(iDirPath+new_file_name))

2行目の p を paths[p] に変えて下さい。
あるいは for p in paths: として、6行目の paths[p] を p に変えて下さい。


TypeError: expected str, bytes or os.PathLike object, not int

↓ こういう意味です。
型エラー: str型・bytes型・os.PathLike型のどれかが欲しいよ、intじゃなくて。

投稿2022/09/03 14:54

編集2022/09/03 14:56
LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aspara

2022/09/03 14:58

paths[p]にしたところ os.renameのところでエラーがでてしまいました can only concatenate str (not "tuple") to str
LouiS0616

2022/09/03 15:01

str型とstr型を結合してね、タプルじゃなくて。って書いてあります。 たぶん iDirPath+new_file_name がいかんのでしょう。
LouiS0616

2022/09/03 15:03

そもそも os.path.join の引数が一つなのは意味的に変な気もしますし、 左側の式と同じように os.path.join(iDirPath, new_file_name) とすべきなのでは。
LouiS0616

2022/09/03 15:04

ついでに new_file_name=NameEntry,name も new_file_name=NameEntry.name の誤りじゃないですか?
aspara

2022/09/03 15:10

+は普通に間違えてましたすいません ,にしましたがos.renameのところでまたエラーがでてしまいました join() argument must be str or bytes, not 'tuple'
LouiS0616

2022/09/03 15:12

どういう意味だと思いますか?argumentが『引数』を指していることを知っていれば読めるかと。
aspara

2022/09/03 15:17

joinの引数がtupleじゃなくてstrかbyteじゃなきゃだめってことだと思うのですがtupleをあまり見たことなくて調べたのですが感覚的にlistに似てる感じであってますかね?
LouiS0616

2022/09/03 15:20

役割は違いますが、値の集まりという点ではリストに似ているかもですね。 いずれにせよ、引数の iDirPath と new_file_name のいずれかがタプルになってるわけです。おそらく意図とは異なるでしょうから、どんな値が入っているのか改めて点検する必要がありますね。
aspara

2022/09/03 15:30

調べたらnew_file_nameがtupleになっていたのでstr()でstrにしてみたのですがtypeerrorは消えましたがWinError 123が出てしまって少し自分で頑張って対処してみます ダメそうだったらここにコメントします 夜中にわざわざありがとうございました!
aspara

2022/09/04 00:45

動きました! 原因はnew_file_nameの中に拡張子を入れていなかったのが原因でした ありがとうございました!
guest

0

コード詳細読んでないのでエスパー回答となりますが
name = os.path.splitext(os.path.basename(p))[0]ではなく
name = os.path.splitext(os.path.basename(paths[p]))[0]なのでしょう。

投稿2022/09/03 14:51

編集2022/09/03 14:52
can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問