改行で区切られたファイルを読み取り、改行を破棄するための最良の方法は?


84

Pythonで改行区切りファイルを読み取るときに、改行を取り除くための最良の方法を決定しようとしています。

私が思いついたのは次のコードで、テストする使い捨てコードが含まれています。

import os

def getfile(filename,results):
   f = open(filename)
   filecontents = f.readlines()
   for line in filecontents:
     foo = line.strip('\n')
     results.append(foo)
   return results

blahblah = []

getfile('/tmp/foo',blahblah)

for x in blahblah:
    print x

提案?


split( "/ n")を使用するのはどうですか?
jle


私は同様にファイルを閉じるには、より良いことだと思う
パヴェルPrażak

回答:


196
lines = open(filename).read().splitlines()

1
この答えは私が望んでいたことを実行します。エラーチェックなどを追加する必要があると確信していますが、この特定のニーズにとっては素晴らしいことです。答えてくれてありがとう!
ソラース2009

私はこれが好きですが、ファイルハンドルを保存しない場合、どのようにファイルを閉じますか?それとも自動的に閉じられますか?
IJケネディ

6
CPythonを使用すると、ファイルオブジェクトの参照カウントは、使用されなくなるとゼロになり、ファイルは自動的に閉じられます。JythonやIronPythonのような純粋にGCされた実装の場合、GCが実行されるまでファイルが閉じられない可能性があるため、この簡潔なバリエーションは最適ではない可能性があります。
Curt Hagenlocher 2012年

2
8GBのRAMを搭載したMacOS X 10.7.5では、最大2047MBのファイルを読み取ることができます(私の定義:1 MB = 1024 x 1024バイト)。2048MBはMemoryError例外をスローします。
Hai Vu 2013

1
@WKPlusすばらしい質問-答えは「状況によって異なります」stackoverflow.com/a/15099341/994153(CPython は参照カウントがゼロになるため閉じますが、他のPython実装では閉じない可能性があるため、明示的にするのが最善です)
Colin D Bennett

23

これがあなたが要求したことをするジェネレーターです。この場合、rstripを使用するだけで十分であり、stripよりもわずかに高速です。

lines = (line.rstrip('\n') for line in open(filename))

ただし、これを使用して、末尾の空白も削除することをお勧めします。

lines = (line.rstrip() for line in open(filename))

()ではなく、RHSの周りに[]あるべきではありませんか?
andrewb 2013

8
@andrewb)(使用した[]を使用するなど多くのメモリとして使用していない発電式与える(リストの理解を。)
ジョナサン・ハートレイ

9

このアプローチについてどう思いますか?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...do something awesome...

ジェネレータ式は、ファイル全体をメモリにロードすることを回避しwith、ファイルを確実に閉じるようにします


これは本質的にTimoLinnaの@と同じである答えは...年間事前に掲示
マーティ


4

ジェネレータ式を使用するだけです。

blahblah = (l.rstrip() for l in open(filename))
for x in blahblah:
    print x

また、メモリ内のファイル全体を読み取らないようにアドバイスしたいと思います。ジェネレータをループする方が、大きなデータセットでははるかに効率的です。


3

私はこれを使います

def cleaned( aFile ):
    for line in aFile:
        yield line.strip()

そうすれば、私はこのようなことができます。

lines = list( cleaned( open("file","r") ) )

または、追加の関数を使用してcleanedを拡張し、たとえば、空白行を削除したり、コメント行をスキップしたりすることもできます。


2

私はこのようにします:

f = open('test.txt')
l = [l for l in f.readlines() if l.strip()]
f.close()
print l

Curt Hagenlocherの答えは技術的には優れていますが、各行に他の処理を追加する必要がある場合は、この答えが出発点として適しています。
TomOnTime 2010

空白行をフィルタリングすることを目的としていたかどうかはわかりませんが... if l.strip() is not ''、これは、私の場合に必要なものよりも簡潔です。
ザックヤング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.