web-dev-qa-db-ja.com

ディレクトリからすべてのファイルを読み取る

次のコードは、ダウンロードディレクトリ内のすべてのファイルを読み取ることですが、このコードを実行すると、印刷(表示)されません。このコードの何が問題になっていますか?

import glob   
path = '/home/mypc/download/*.html'   
files=glob.glob(path)   
for file in files:     
    f=open(file, 'r')  
    f.readlines()   
    f.close() 
4
Naive

ファイルオブジェクトの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.
8

少なくとも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の入力と出力 に関するドキュメントをお読みください。

4
Radu Rădeanu

印刷コマンドを使用するために必要なファイル名を表示したい

import glob   
path = '/home/mypc/download/*.html'   
files=glob.glob(path)   
for file in files: 
    print file
1
Lars H

内容を印刷するのではなく、ファイルを読み取るためのコードを記述しただけです。それがあなたがやりたいことなら、あなたは置き換えることができます

f.readlines() 

で:

for line in f:
    print line 

お役に立てば幸いです。

1
Sazhen86