• ベストアンサー

pythonでの日本語操作

お世話になります。 現在、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に日本語が含まれない場合には、一覧が取得できます。 お手数ですが、分かる方いらっしゃいましたら教えてくださいませ。

質問者が選んだベストアンサー

  • ベストアンサー
  • struct
  • ベストアンサー率72% (32/44)
回答No.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
cocomonchi
質問者

お礼

ご回答ありがとうございました。 理想の形になりました! 色々試していた中でつまずいた結果、上記コードになりました。 なんかpythonが楽しくなってきました! 本当にありがとうございました。

その他の回答 (2)

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.2

次の方法で対応出来そうです。 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") #全角コード変換は面倒ですね。

cocomonchi
質問者

お礼

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

  • goosyu
  • ベストアンサー率58% (36/62)
回答No.1

ちょっと手元の環境で確認しましたが次の修正を行うと改善されるかも しれません。 【修正点】 path = "D:\Myfiles\あいうえお\ " 【お試し】 path = u"D:\\Myfiles\\あいうえお\\"

cocomonchi
質問者

補足

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

関連するQ&A

  • teraterm上でpythonを使いcsvファイルでいろいろやりたいんですが,...

    すいません。pythonを使いはじめてまだ3日のド素人の意見と思いお付き合いしてください。 pythonで、csvファイルの中にあるカラム10番目の項目にある人数を、1番目のフィールドは項目名なので読みとばして足し合わせいきたいんですが、まだ理解がぜんぜん足りなくて #!/usr/bin/env/python #!coding: utf-8   import sys,string,csv   for line in sys.stdin.readlines(): words = string.split(line, ',')   sum += string.lower(word[10])   print sum と書いて、ファイルを読み込むんですけど、うんともすんとも言わないです。 どなたかアドバイス御願いします。

  • pythonのエラーについて教えてください。

    pythonの勉強しています。練習として以下の様なコードを書きました。 #!/usr/bin/python # coding=utf-8 f = open('aw1.txt' 'r') for row in f: line_data = row.split(' ') print(line_data(1)) f.close() aw1.txtというファイルは自分でviで作成しました。 このpythonスクリプトを実行すると IOError: [Errno 2] No such file or directory: 'aw1.txtr' というエラーになってしまいます。 でも f = open('aw1.txt' 'r') と書いて なぜ 'aw1.txtr'というファイルがないというエラーとなるのかがわかりません。 どこが間違っているのでしょうか? どなたか教えていただけないでしょうか?

  • pythonのプログラムを走らせるには?

    使用するソフトウェアの関係でWeb(HTMLまたはPHP)とPythonの連携が必要になりました。 しかしPythonをWebで扱ったことがなくいまいちどうしたらいいのか分りません。 <form action="/python/pythontest.py" method="GET">  <input type="submit" name="submit" value="更新"> </form> といった形で呼び出しているのですがファイルが開かれるだけでptythonのプログラムが実行されません。 pythonのプログラムは #!/usr/bin/env python # coding: utf-8 import cgi from datetime import datetime html_body = u""" <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> %s </body> </html>""" content='' print "Content-type: text/html;charset=utf-8\n" print (html_body % content).encode('utf-8') と書いています。 何が原因なのでしょうか? /usr/bin/env python のパスがうまく通っていないからでしょうか?

    • ベストアンサー
    • HTML
  • PythonのUnicode文字について 

    PythonのUnicode文字について  最近pythonを始めました。このサイト(http://www.pythonweb.jp/index.html)でいろいろと勉強しているのですがUnicode文字についてよくわかりません。 #coding: UTF-8 print u"こんにちは" と入力するとなぜか File "test.py", line 2 print u"こんにちは" SyntaxError: (unicode error) 'utf8' codec can't decode byte 0x82 in position 0: unexpected code byteと表示され出力されませんでした。何故でしょうか。unicode文字についても説明をお願いします。

  • Python で日本語(Mac OSX)

    Mac で Python を使用しようと、python 2.5 をインストールしました。 OS は 10.4.8 で、Terminal では一般で言われているように UTF-8 で日本語使用可にしています。しかしスクリプトファイルを実行すると、 Non-ASCII character '?xef' in file と日本語のコメントでシンタックスエラーが出てしまい実行できません。スクリプトファイルは UTF-8 形式です。日本語のコメントが含まれていないと正常に実行されます。 職場では Windows で使用しており、そのファイルを家のMacに持ち込む事が多いのですが、Windowsでは日本語コメントが入っていても問題なく実行されています。 どうぞよろしくお願いいたします。

  • pythonで日本語csvからデータを読み込みたい

    python初心者です。 mac上で、csvファイルからデータを読み込んでデータベースを作りたいのですが… csvの中身は、例えば ID, 名字,名前, 年齢, 出身地 1, 山田, 太郎, 30, 大阪 2, 田中, 和夫, 55, 千葉 ... のような、極めてシンプルな感じです。 色々調べて、エンコードの問題があることは理解しましたが、web上の解決策を試してもなぜかうまく行きません。(python2.7です。) #coding:utf-8 import csv inputfile = open(u'data.csv', 'rU') reader = csv.DictReader(inputfile) for r in reader: print r とすると、1行ずつ読み込めてはいますが、printしたときの日本語が読めません。 どうすれば良いのでしょうか? また、読めないですが、プログラム内でデータのやり取りをする分には問題ないのでしょうか? (例えば、1番とX番の出身地が同じ、の判定をするとか) 非常に基本的な問題だと思うのですが、sqlでデータベースを作る前のこの段階で躓いて、全然前に進めずにいます(>_<) どうか教えて下さい、宜しくお願いします。

  • Python2.6で日本語(UTF-8)が文字化けしてしまいます。

    Python2.6で日本語(UTF-8)が文字化けしてしまいます。 非常に困ってます。よろしくお願いします。 使用OS Windows7 使用エディタ SciTE #coding: shift-jisだとエラーがでます。 標準入力、標準出力、標準エラー出力の文字コード cp932 コード # coding: utf-8 import random class Dice: def __init__(self,val=6): if val not in [4,6,8,12,20]: raise Exception('そんな正多面体はありません。') self.face_num = val def shoot(self): return random.randint(1,self.face_num) ------------------------------------------------------------ 実行 C:\Users\eric\pyworks>python Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import dice >>> a =dice.Dice(9) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "dice.py", line 8, in __init__ raise Exception('縺昴s縺ェ豁」螟夐擇菴薙・縺ゅj縺セ縺帙s縲・) Exception: 縺昴s縺ェ豁」螟夐擇菴薙・縺ゅj縺セ縺帙s縲

  • QGISを外部Pythonで制御したい

    2014.10.17に「QGISのメニューのプラグインにあるPythonコンソールからは動作させる事ができますが、外部のPythonを立ち上げて同様なコードを入力してもNameエラーになってしまいます。PATHの問題かな?と思って変えてみたりはしたのですがうまくいきません。アドバイスをお願いします。1、2ヶ月の初心者です。」と質問しました。 翌日に「OSGeo4Wをご利用であれば、OSGeo4W環境に次の環境変数の設定を追加する必要があります。 set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis set PATH=%PATH%;%OSGEO4W_ROOT%\apps\qgis\bin set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis\python」とのご回答を頂きました。 コマンドプロンプトで、対話形式やbatファイルを作成して実行しましたがうまく動作しません。 それで再度質問させて頂きます。よろしくご教授下さい。 Windows8.1、QGISは2.2.0-Valmiera、Pythonは2.7.8です。ユーザー環境変数のPATHは、C:\Program Files (x86)\QGIS Valmiera\bin;C:\Users\myname\Documents\GIS DataBase;C:\Program Files (x86)\IronPython 2.7;C:\Python27 としています(GIS DataBaseには地図データが入っています。)。Pythonで iface=qgis.utils.iface と入力すると ・・・・NameError: name 'qgis' is not defined と出て次に進めません。コマンドプロンプトで python と入力するとpythonのプロンプトに変わりますし、qgis と入力すると OSGEO4W home is C:\PROGRA~2\QGISVA~1 と短表示が出てQGISが起動します。教えて頂いた環境変数の設定の追加をコマンドプロンプトで対話形式やbatファイルを作成して実行しましたが同じです。よろしくお願い致します。

  • [svn+python]tracのinitenv中のsubversionエラー

    自分のマシン(Mac OS 10.5.5)にtracを導入に挑戦してる途中でのエラーで困っています。 tracのインストールを終え、リポジトリ作成、作業コピー作成を終えた後にinitenvしました。 Prohect Name, Database connection string, Repository type, Path to Repositoryを入力してEnterを押すと、以下の様なエラーが出ます。 ...(略) WikiStart imported from /Library/Python/2.5/site-packages/Trac-0.11.1.ja2-py2.5.egg/trac/wiki/default-pages/WikiStart Initenv for '/[Projetを作ろうとしたディレクトリ]/ProjectName' failed. ("Expected FS format '2'; found format '3'", 160043) Traceback (most recent call last): File "/Library/Python/2.5/site-packages/Trac-0.11.1.ja2-py2.5.egg/trac/admin/console.py", line 586, in do_initenv repos = self.__env.get_repository() File "/Library/Python/2.5/site-packages/Trac-0.11.1.ja2-py2.5.egg/trac/env.py", line 270, in get_repository return RepositoryManager(self).get_repository(authname) File "/Library/Python/2.5/site-packages/Trac-0.11.1.ja2-py2.5.egg/trac/versioncontrol/api.py", line 157, in get_repository repos = self._connector.get_repository(rtype, rdir, authname) File "/Library/Python/2.5/site-packages/Trac-0.11.1.ja2-py2.5.egg/trac/versioncontrol/svn_fs.py", line 280, in get_repository 'branches': self.branches}) File "/Library/Python/2.5/site-packages/Trac-0.11.1.ja2-py2.5.egg/trac/versioncontrol/svn_fs.py", line 401, in __init__ self.repos = repos.svn_repos_open(self.path, self.pool()) File "/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/libsvn/repos.py", line 47, in svn_repos_open return apply(_repos.svn_repos_open, args) SubversionException: ("Expected FS format '2'; found format '3'", 160043) 自分なりに調べ、「マシン内に複数バージョンのSubversionがあって、Pythonに通っているsvnへのパスがSubverion 1.5.xx。期待されていたのは1.4.xx」という風に認識しています。が、この先どうしたら良いかわからなくなってしまい、困ってしまいました。 質問は以下の3つ(4つ)です。 ■自分のマシンに入っているSubversionの一覧を知りたい ■Terminalで"which svn"と打つと、「/opt/local/bin/svn」と返ってきます。これが自分のマシン内に複数あるSubversionのどれを見に行っているのかを知りたい ■1.4.xxにパスを通したい or 1.5.xxを期待させたい (■その他上記エラーの解決策を知りたい) よろしくお願いします。

  • python3.2で外部プログラムを実行&操作

    民安TALKという音声読み上げソフトを実行&操作するプログラムがあります。これをpythonで書いてみようと思ったのですが、どうすればいいのかがわかりません。 <環境など> 民安TALK(ソース) http://uep.s321.xrea.com/src/index.html OS:Windows7 version:python3.2 <具体的にどうしたいのか> テキストを入力し、再生ボタンを押すとテキストを読みあげるプログラム(.exe)に対し、そのプログラムがまだ起動していなかったら起動して、テキストを入力し、再生ボタンを押すということをやりたいです。ちなみに再生ボタンにはショートカットキーは設定されてません。 現在、プログラムを起動するところで詰まっています from subprocess import Popen p = Popen("絶対path") とすると外部プログラム(.exe)を実行できると思うのですが、これだと設定ファイルの読み込みに失敗してしまいます。pythonからではなく、コマンドプロンプトでカレントディレクトリをその外部プログラムのあるディレクトリに移動しプログラム名.exeとすれば実行できます。

専門家に質問してみよう