web-dev-qa-db-ja.com

pythonでファイルの最終行を読み取る

私には2つの要件があります。

最初の要件-ファイルの最後の行を読み取り、Pythonの変数に最後の値を割り当てたい。

2番目の要件-

これが私のサンプルファイルです。

<serviceNameame="demo" wsdlUrl="demo.wsdl" serviceName="demo"/>
<context:property-placeholder location="filename.txt"/>

このファイルから内容を読み取りたいfilename.txt<context:property-placeholder location= .の後にあり、その値をPythonの変数に割り当てます。

6
techi

ファイル全体をメモリに保存する必要のない単純なソリューション(例:file.readlines()または同等の構成):

with open('filename.txt') as f:
    for line in f:
        pass
    last_line = line

大きなファイルの場合、ファイルの終わりまでシークし、後方に移動して改行を見つけるほうが効率的です。例:

import os

with open('filename.txt', 'rb') as f:
    f.seek(-2, os.SEEK_END). 
    while f.read(1) != b'\n':
        f.seek(-2, os.SEEK_CUR) 
    last_line = f.readline().decode()
10
Eugene Yarmash

なぜすべての行を読み取り、最後の行を変数に格納するのですか?

with open('filename.txt', 'r') as f:
    last_line = f_read.readlines()[-1]
8
Woops

tailコマンドのあるシステムでは、tailを使用できます。これにより、大きなファイルの場合、ファイル全体を読み取る必要がなくなります。

_from subprocess import Popen, PIPE
f = 'yourfilename.txt'
# Get the last line from the file
p = Popen(['tail','-1',f],Shell=False, stderr=PIPE, stdout=PIPE)
res,err = p.communicate()
if err:
    print (err.decode())
else:
    # Use split to get the part of the line that you require
    res = res.decode().split('location="')[1].strip().split('"')[0]
    print (res)
_

注:decode()コマンドは_python3_にのみ必要です

_res = res.split('location="')[1].strip().split('"')[0]
_

_python2.x_で機能します

2
Rolf of Saxony

彼は、ファイルの行を読み取る方法や、変数に最後の行を読み取る方法を尋ねているだけではありません。また、ターゲット値を含む、最後の行の部分文字列を解析する方法を尋ねています。

これが1つの方法です。それは最短の方法ですか?いいえ。ただし、文字列をスライスする方法がわからない場合は、ここで使用する各組み込み関数を学習することから始めます。このコードはあなたが望むものを取得します:

_# Open the file
myfile = open("filename.txt", "r")
# Read all the lines into a List
lst = list(myfile.readlines())
# Close the file
myfile.close()
# Get just the last line
lastline = lst[len(lst)-1]
# Locate the start of the label you want, 
# and set the start position at the end 
# of the label:
intStart = lastline.find('location="') + 10
# snip off a substring from the 
# target value to the end (this is called a slice):
sub = lastline[intStart:]
# Your ending marker is now the 
# ending quote (") that is located 
# at the end of your target value.
# Get it's index.
intEnd = sub.find('"')
# Finally, grab the value, using 
# another slice operation.
finalvalue = sub[0:intEnd]
print finalvalue
_

印刷コマンドの出力は次のようになります。

_filename.txt
_

ここで取り上げるトピック:

  • テキストファイルの読み取り
  • Pythonコンテンツからの行のリストを作成し、ゼロベースのインデックスlen(List) -1を使用して最後の行を簡単に取得できるようにします。
  • findを使用して文字列内の文字列のインデックス位置を取得する
  • sliceを使用して部分文字列を取得する

これらのトピックはすべてPythonのドキュメントにあります。ここには何も追加されておらず、ここで使用された組み込み関数を使用するためにインポートする必要はありません。

乾杯、
-=キャメロン

1
Cameron Landers

https://docs.python.org/3/library/collections.html の例

from collections import deque

def tail(filename, n=10):
    'Return the last n lines of a file'
    with open(filename) as f:
        return deque(f, n) 
0
Paal Pedersen