次のコードは、ダウンロードディレクトリ内のすべてのファイルを読み取ることですが、このコードを実行すると、印刷(表示)されません。このコードの何が問題になっていますか?
import glob
path = '/home/mypc/download/*.html'
files=glob.glob(path)
for file in files:
f=open(file, 'r')
f.readlines()
f.close()
ファイルオブジェクトのreadlines()
メソッドは、Pythonリストを返します。ファイルの内容をstdoutに自動的に書き込みません:Pythonはスクリプト言語ですが、シェルスクリッピング言語ではありません!
交換する必要があります:
f.readlines()
で:
sys.stdout.write(f.read())
read()
の代わりにreadlines()
を使用していることに注意してください。前にも言ったように、readlines()
はリストを返しますが、ここでは文字列を出力します。そしてread()
は必要な処理を行います。ファイル全体を読み取り、文字列を返します。ファイルが巨大な場合(大量のメモリを使用するため)最適ではありませんが、機能します。
コードに欠陥があることは注目に値します。あなたは言いました:次のコードはダウンロードディレクトリのすべてのファイルを読むことです。実際にコードは、.html
で終わるファイルとディレクトリの両方を読み取ろうとします。コードで.html
で終わるディレクトリが見つかった場合、大規模にクラッシュします。
最後に、ファイルを開くとき、特に多くのファイルを開くときは、with
ステートメントを使用することをお勧めします。 with
ステートメントは、エラーが発生した場合でも、作業を終えるとすぐにファイルが閉じられるようにします。
したがって、コードは次のようになります。
import sys
import glob
import errno
path = '/home/mypc/download/*.html'
files = glob.glob(path)
for name in files: # 'file' is a builtin type, 'name' is a less-ambiguous variable name.
try:
with open(name) as f: # No need to specify 'r': this is the default.
sys.stdout.write(f.read())
except IOError as exc:
if exc.errno != errno.EISDIR: # Do not fail if a directory is found, just ignore it.
raise # Propagate other kinds of IOError.
少なくとも1つのprint
を使用できます。例えば:
#!/usr/bin/env python
import glob
path = '/home/mypc/download/*.html'
files=glob.glob(path)
for file in files:
f=open(file, 'r')
print '%s' % f.readlines()
f.close()
#if you want to print only the filenames, use 'print file' instead of three previous lines
そして、 Pythonの入力と出力 に関するドキュメントをお読みください。
印刷コマンドを使用するために必要なファイル名を表示したい
import glob
path = '/home/mypc/download/*.html'
files=glob.glob(path)
for file in files:
print file
内容を印刷するのではなく、ファイルを読み取るためのコードを記述しただけです。それがあなたがやりたいことなら、あなたは置き換えることができます
f.readlines()
で:
for line in f:
print line
お役に立てば幸いです。