11

Python 3 で文字列のn行目を取得するにはどうすればよいですか? 例えば

getline("line1\nline2\nline3",3)

stdlib/builtin 関数を使用してこれを行う方法はありますか? 私は Python 3 でのソリューションを好みますが、Python 2 でも問題ありません。

4

9 に答える 9

25

次のことを試してください。

s = "line1\nline2\nline3"
print s.splitlines()[2]
于 2012-07-15T12:24:45.803 に答える
5

機能的アプローチ

>>> import StringIO
>>> from itertools import islice
>>> s = "line1\nline2\nline3"
>>> gen = StringIO.StringIO(s)
>>> print next(islice(gen, 2, 3))
line3
于 2012-07-15T13:07:06.320 に答える
4
`my_string.strip().split("\n")[-1]`
于 2018-10-24T01:03:12.920 に答える
3

文字列バッファーを使用します。

import io    
def getLine(data, line_no):
    buffer = io.StringIO(data)
    for i in range(line_no - 1):
        try:
            next(buffer)
        except StopIteration:
            return '' #Reached EOF

    try:
        return next(buffer)
    except StopIteration:
        return '' #Reached EOF
于 2012-07-15T12:31:09.997 に答える
3

文字列を分割するよりも効率的な解決策は、その文字を反復処理して、「\n」の N 番目と (N - 1) 番目の出現位置を見つけることです (文字列の先頭のエッジ ケースを考慮して)。 . N 番目の行は、これらの位置の間の部分文字列です。

これを示すための厄介なコードを次に示します (行番号は 1 インデックスです)。

def getLine(data, line_no):
    n = 0
    lastPos = -1
    for i in range(0, len(data) - 1):
        if data[i] == "\n":
            n = n + 1
            if n == line_no:
                return data[lastPos + 1:i]
            else:
                lastPos = i;



    if(n == line_no - 1):
        return data[lastPos + 1:]
    return "" # end of string

これは、文字列を一度に 1 文字ずつ構築するソリューションよりも効率的です。

于 2012-07-15T12:32:20.920 に答える
2

コメントから、この文字列が非常に大きいように見えます。データが多すぎてメモリに快適に収まらない場合、1 つのアプローチは、次のようにファイルからのデータを 1 行ずつ処理することです。

N = ...
with open('data.txt') as inf:
    for count, line in enumerate(inf, 1):
        if count == N: #search for the N'th line
            print line

enumerate()を使用すると、反復しているオブジェクトのインデックスと値が得られ、開始値を指定できるため、(デフォルト値の 0 ではなく) 1 を使用しました。

を使用する利点は、with完了時または例外が発生した場合にファイルが自動的に閉じられることです。

于 2012-07-15T12:22:23.717 に答える
1

あなたはメモリ効率のポイントを持ち出したので、これはもっと良いですか:

s = "line1\nline2\nline3"

# number of the line you want
line_number = 2

i = 0
line = ''
for c in s:
   if i > line_number:
     break
   else:
     if i == line_number-1 and c != '\n':
       line += c
     elif c == '\n':
       i += 1
于 2012-07-15T12:45:54.853 に答える
-3

私の解決策(効率的でコンパクト):

def getLine(data, line_no):
    index = -1
    for _ in range(line_no):index = data.index('\n',index+1)
    return data[index+1:data.index('\n',index+1)]
于 2012-07-15T13:05:23.010 に答える