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

お世話になります。
現在、pythonにてあるディレクトリの一覧を表示させるプログラムをしているのですが、対象の中に日本語を含むディレクトリ・ファイルがあると
処理が行われません。

現在書いているコードです。↓
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# ファイルとサブディレクトリのパスを表示する
import os, os.path
path = "D:\Myfiles\あいうえお\ "
for root, dirs, files in os.walk(path):
for file in files:
print os.path.join(root)


環境はwindowsXP,python2.6です。
エンコード・デコードを行ったのですがうまくいきませんでした。
ちなみに、pathに日本語が含まれない場合には、一覧が取得できます。

お手数ですが、分かる方いらっしゃいましたら教えてくださいませ。

A 回答 (3件)

上のコードを正しくインデントするとこうでしょうか?



import os, os.path
path = "D:\Myfiles\あいうえお\ "
for root, dirs, files in os.walk(path):
___ for file in files:
_______ print os.path.join(root)

こうすると、ディレクトリの中にあるファイルの数(!)だけ
そのディレクトリの名前(!)を表示するってコードになるんですが、
正しい動作なんでしょうか?

# -*- coding: utf-8 -*-

あと、こう書いてあるってことは
ソースコードはUTF-8で書いてますよね?
この場合、ディレクトリやファイルを指定するパスは
全てunicode文字列にする必要があります。
(もしくは明示的にShift_JISに変換する。)
よって以下のように書いてください。

path = u"D:\\Myfiles\\あいうえお"

\ のエスケープもお忘れなく。

ちなみに、os.walk関数の引数にunicodeを渡すと
戻り値もunicodeになります。

それから、os.path.join関数は
複数の文字列をパスとして結合する関数です。
上のコードからは何がしたいのかよく意味が汲み取れないのですが、
ファイルの一覧を絶対パス(!)で欲しいということであれば
以下のようにrootとfileを引数に指定します。

print os.path.join(root, file)

あと、fileはビルトイン型として存在するので
変数として使わないほうがいいです。

尚、osをimportすると、os.pathは自動的にimportされます。

以上をまとめると、正しいコードはこうでしょうか。

# ファイル(!)とサブディレクトリ(!)のパスを表示する
import os
path = u"D:\\Myfiles\\あいうえお"
for root, dirs, files in os.walk(path):
___ for f in files:
_______ print os.path.join(root, f)
___ for d in dirs:
_______ print os.path.join(root, d)

参考URL:http://docs.python.org/library/os.html#os.walk
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
理想の形になりました!

色々試していた中でつまずいた結果、上記コードになりました。
なんかpythonが楽しくなってきました!

本当にありがとうございました。

お礼日時:2009/08/04 17:37

次の方法で対応出来そうです。



print os.path.join(dirs)
print os.path.join(files)
→変更点
print str(os.path.join(dirs)).decode("Unicode-Escape")
print str(os.path.join(files)).decode("Unicode-Escape")

#全角コード変換は面倒ですね。
    • good
    • 0
この回答へのお礼

なるほど!

ただ、上記の結果を行うと
print str(os.path.join(dirs)).decode("Unicode-Escape")
[u'aaa', u'新しいフォルダ']
となります。「u」はしょうがないんでしょうか。。
さらにこれは私の環境のみ出力され、他のマシンではフォルダ名/ファイル名のみ表示されるという不可解さ。

pythonは日本語の扱いで苦戦しますね。

色々と勉強になりました。
ありがとうございました。

お礼日時:2009/08/04 15:37

ちょっと手元の環境で確認しましたが次の修正を行うと改善されるかも


しれません。

【修正点】
path = "D:\Myfiles\あいうえお\ "
【お試し】
path = u"D:\\Myfiles\\あいうえお\\"

この回答への補足

ご回答ありがとうございました。
教えて頂いた方式で上手く言ったのですが、
上記コードの下に以下の内容を記述したところ
print os.path.join(dirs)
print os.path.join(files)
日本語ファイルの結果が、u'\ubna~
のような結果になりました。日本語化して表示したいのですが
デコード?などうまくいかず。。
もしご存じでしたら併せてご教授いただけないでしょうか?
宜しくお願いいたします。

補足日時:2009/08/04 10:03
    • good
    • 0

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