2016-04-06 6 views
0

ファイル名が空白のファイルがあるディレクトリがあります。これらのファイルを読み込んで、tail -n1コマンドを実行するPythonスクリプトがありますが、名前に空白があるためそれは失敗します。たとえば。ディレクトリに空白を含むファイル名を扱う

私は、次のファイル

data from_10_13_2014 09_00_45.json

とdirctoryを持っていると私は次のエラー

tail: cannot open ‘/home/dataserver/Development/Test/data’ for reading: No such file or directory 
tail: cannot open ‘from_10_13_2014’ for reading: No such file or directory 
tail: cannot open ‘09_00_45.json’ for reading: No such file or directory 

に回避策を取得し、今のように私のスクリプトは次の行line = os.popen("tail -n1 %s" % files).read()

が含まれています私は現在、空白を_に置き換えていますファイルは?

答えて

2

代わりに"tail -n1 %r"を試してください。文字列の文字列表現、つまりtail -n1 "data from_10_13_2014 09_00_45.json"を使用します。

また、subprocessモジュールを使用すると、よりうまく切り替えることができます。ここでは、例えば、自動的に引数をエスケープsubprocess.check_output機能を使用することができます。

tail_line = subprocess.check_output(["tail", "-n1", files]) 

は、私はあなたがファイル名に全く空白を使用しないことをお勧めします、それは常に最後にスクリプトを壊してしまいます。たぶん、ファイル名を正規化する2番目のスクリプトを書くことができますか?

+1

は、残念ながら私は、そのファイル名を制御することはできません彼らは我々が使用するセンサーによって生成され、それを変更する方法はありません、ありがとうございます。 – cyberbemon

+0

ああ、人生は時々難しいです:) –

0

files\と置き換えてください。だからバックスラッシュ+スペース。

0

問題は、あなたがコマンドラインを解析するためにpopenに依存していることです。もちろん、空白を使用して解析しています。より良い解決策は、個々の引数のリストを構築して、コマンドラインの解析を行わなければならないようにすることです。

それを行う最も簡単な方法は、subprocess.check_outputを使用することです:

line = subprocess.check_output(["tail", "-n1", "/tmp/junk.py"]) 
関連する問題