2016-04-06 4 views
0

1)私は、ファイルPython 3 re.findall closing file?</p> <p>3期待通りのリストを返す<code>re.findall()</code>

2を開く)の実行)、その後、私はre.findall()を実行するには、再度、他の何かを探しているが、それは空のリストを返します。

しかし、2と3の間でもう一度ファイルを開くと、2番目のre.findall()が完全に機能します。

何が起こっているのかわからないのですが、reはファイルを閉じていますか?何か他に起こっていることはありますか?

ご協力いただきありがとうございます。

ここに私のコードだ

def extract_names(filenames): 
    for f in filenames: #grabs one file at a time 
    file = open(f, 'r') #opens file 

    #find year <h3 align="center">Popularity in 1992</h3> 
    year = re.search(r'Popularity\sin\s\d{4}', file.read()) 
    print(year) 

    file = open(f, 'r') #reopen file 

    #find <tr align="right"><td>1</td><td>Michael</td><td>Ashley</td> 
    rank_names = re.search(r'<td>\d*</td><td>\w*</td><td>\w*</td>', file.read()) 
    print(rank_names) 
+1

最初にHtmlパーサを使用します。あなたの問題については、同じファイルハンドラに対して 'file.read()'を2回使用することはできません(最初に読み込まれると2回目の読み込みはそれ以上ありません)。 –

答えて

1

file.read()は、ファイル全体を消費し、ファイルの最後にファイルポインタを進めます。後でfile.read()を呼び出すと、空の文字列が返されます(ファイルが既に消費されているため)。ファイルポインタをファイルの先頭に戻すにはfile.seek(0)に電話をかけることができますが、一度読むことができ、余分なシステムコールを避けるために内容を保存すると、ファイルを2回読み取るのは愚かです。

あなたは、例えば、複数回のファイルデータを検索file.read()の結果を格納し、あなたの呼び出しでfile.read()の代わりにそれを使用したい場合:

filedata = file.read() # Cache once 

year = re.search(r'Popularity\sin\s\d{4}', filedata) # Search in cache 
print(year) 

#find <tr align="right"><td>1</td><td>Michael</td><td>Ashley</td> 
rank_names = re.search(r'<td>\d*</td><td>\w*</td><td>\w*</td>', filedata) # Search cache again 
print(rank_names) 

余談:Use a real HTML parser

1

ファイルポインタがfile.read()の後にファイルの最後に移動されたため、file.read()を再度使用してこのファイルの内容全体を取得することはできません。

次の操作のためにファイルの内容を保存することができる:

for f in filenames: 
    with open(f, 'r') as file: 
     content = file.read() 
0

がなぜいけない:

content = file.read() 
year = re.search(r'Popularity\sin\s\d{4}', content) 
rank_names = re.search(r'<td>\d*</td><td>\w*</td><td>\w*</td>', content) 
file.close() 

そしてwithキーワードは、自動的にファイルハンドラを閉じることができ、ファイル操作に使用することをお勧めしますread()の外に出てくるstrという名前を付けます。

with open("filename", "rt") as f: 
    content = f.read() 

ここで、オブジェクトをcontentとして何度も参照できます。 open()操作が多いほどオーバーヘッドが増えます。そしてread([chunk])イテレータを返しopen()としては、左の何もないまで、chunkによってそれchunkを消費します。これで、2回目に空のコンテナが得られたのです。

関連する問題