Pythonでファイルのすべての行を読み取り、各行を要素としてリストに保存するにはどうすればよいですか?
ファイルを1行ずつ読み取り、リストの最後に各行を追加したいと思います。
Pythonでファイルのすべての行を読み取り、各行を要素としてリストに保存するにはどうすればよいですか?
ファイルを1行ずつ読み取り、リストの最後に各行を追加したいと思います。
回答:
with open(filename) as f:
content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]
readlines()
、MemoryErrorが発生する可能性があるため、あまり効率的ではありません。この場合for line in f:
、各line
変数を使用して作業するファイルを反復処理することをお勧めします。
.rstrip()
行末から空白を取り除く場合は、少し速く動作します。
with open(filename) as f: content = [i.strip() for i in f.readlines()]
入力と出力を参照してください。
with open('filename') as f:
lines = f.readlines()
または改行文字を削除して:
with open('filename') as f:
lines = [line.rstrip() for line in f]
f.read().splitlines()
改行を削除するを使用してください
for line in open(filename)
安全な2番目のバージョンはありますか?つまり、ファイルは自動的に閉じられますか?
lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]
このように書き込んだ場合、読み取り後にファイルを閉じるにはどうすればよいですか?
open
、コンテキストマネージャーなしで使用することは「ベストプラクティス」ではありません(またはそれを閉じるための他の保証された方法)、これは実際にはそれらのケースの1つではありません-オブジェクトに参照がない場合リスト内包の処理が完了すると、ガベージコレクションされてファイルが閉じられます。
これは必要以上に明白ですが、あなたが望むことをします。
with open("file.txt") as file_in:
lines = []
for line in file_in:
lines.append(line)
array
、追加されますが、他の状況も考えられます)。確かに大きなファイルの場合、このアプローチは問題を軽減するかもしれません。
これにより、ファイルから行の「配列」が生成されます。
lines = tuple(open(filename, 'r'))
open
反復可能なファイルを返します。ファイルを反復処理すると、そのファイルから行が取得されます。tuple
イテレータを取得し、指定したイテレータからタプルインスタンスをインスタンス化できます。lines
ファイルの行から作成されたタプルです。
lines = open(filename).read().split('\n')
代わりに試してください。
lines = open(filename).read().splitlines()
少しすっきりしているので、DOSの行末もより適切に処理できると思います。
list
はaよりも約13.22%多くのスペースを占めますtuple
。結果はから来ていfrom sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2)
ます。a tuple
を作成するlist
と、作成するよりも約4.17%時間がかかります(標準偏差は0.16%)。結果はfrom timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2)
30回実行した結果です。私のソリューションでは、可変性の必要性が不明な場合、速度よりもスペースを優先します。
Pythonのファイルオブジェクトのメソッドによると、テキストファイルをに変換する最も簡単な方法list
は次のとおりです。
with open('file.txt') as f:
my_list = list(f)
テキストファイルの行を反復処理する必要があるだけの場合は、次を使用できます。
with open('file.txt') as f:
for line in f:
...
古い答え:
with
およびの使用readlines()
:
with open('file.txt') as f:
lines = f.readlines()
ファイルを閉じてもかまわない場合は、次の1行で機能します。
lines = open('file.txt').readlines()
伝統的な方法:
f = open('file.txt') # Open file on read mode
lines = f.read().split("\n") # Create a list containing all lines
f.close() # Close file
提案されているように、単に次のことを実行できます。
with open('/your/path/file') as f:
my_lines = f.readlines()
このアプローチには2つの欠点があることに注意してください。
1)すべての行をメモリに保存します。一般的なケースでは、これは非常に悪い考えです。ファイルが非常に大きくなり、メモリ不足になる可能性があります。大きくなくても、単なるメモリの浪費です。
2)これは、あなたがそれらを読むときに、各行の処理を許可しません。したがって、この後に行を処理する場合、効率的ではありません(1つではなく2つのパスが必要です)。
一般的なケースのより良いアプローチは次のようになります:
with open('/your/path/file') as f:
for line in f:
process(line)
プロセス関数を好きなように定義する場所。例えば:
def process(line):
if 'save the world' in line.lower():
superman.save_the_world()
(Superman
クラスの実装は演習として残しておきます)。
これはどのファイルサイズでも問題なく機能し、1パスでファイルを処理できます。これは通常、汎用パーサーが機能する方法です。
open('file_path', 'r+')
リストへのデータ
次の行のようなデータを含むテキストファイルがあるとします。
テキストファイルの内容:
line 1
line 2
line 3
python
し、インタープリターで書き込みます。Pythonスクリプト:
>>> with open("myfile.txt", encoding="utf-8") as file:
... x = [l.rstrip("\n") for l in file]
>>> x
['line 1','line 2','line 3']
追加の使用:
x = []
with open("myfile.txt") as file:
for l in file:
x.append(l.strip())
または:
>>> x = open("myfile.txt").read().splitlines()
>>> x
['line 1', 'line 2', 'line 3']
または:
>>> x = open("myfile.txt").readlines()
>>> x
['linea 1\n', 'line 2\n', 'line 3\n']
または:
def print_output(lines_in_textfile):
print("lines_in_textfile =", lines_in_textfile)
y = [x.rstrip() for x in open("001.txt")]
print_output(y)
with open('001.txt', 'r', encoding='utf-8') as file:
file = file.read().splitlines()
print_output(file)
with open('001.txt', 'r', encoding='utf-8') as file:
file = [x.rstrip("\n") for x in file]
print_output(file)
出力:
lines_in_textfile = ['line 1', 'line 2', 'line 3']
lines_in_textfile = ['line 1', 'line 2', 'line 3']
lines_in_textfile = ['line 1', 'line 2', 'line 3']
read().splitlines()
Pythonによって提供されます。それreadlines()
は単純です(無駄が少ないため、おそらくより高速です)。
read().splitlines()
とreadlines()
同じ出力を生成しません。それらは同等ですか?
strip()
なければならないrstrip("\n")
か、線の周りにスペースが削除されます。また、readlines()
リスト内包で実行しても意味がありません。行の中間リストを作成することで時間とメモリを無駄にしないため、単にファイルを反復する方が優れています。
ファイルをリストに読み込むには、次の3つのことを行う必要があります。
さいわい、Pythonではこれらのことを非常に簡単に実行できるので、ファイルをリストに読み込む最短の方法は次のとおりです。
lst = list(open(filename))
ただし、もう少し説明を加えます。
特定のファイルを開きたいのに、ファイルハンドル(またはファイルのようなハンドル)を直接処理しないと仮定します。Pythonでファイルを開くために最も一般的に使用される関数はでopen
、Python 2.7では1つの必須の引数と2つのオプションの引数を取ります。
ファイル名は、ファイルへのパスを表す文字列である必要があります。例えば:
open('afile') # opens the file named afile in the current working directory
open('adir/afile') # relative path (relative to the current working directory)
open('C:/users/aname/afile') # absolute path (windows)
open('/usr/local/afile') # absolute path (linux)
ファイル拡張子を指定する必要があることに注意してください。.txt
または.doc
などのファイル拡張子は、エクスプローラで表示したときにデフォルトで非表示になるため、これはWindowsユーザーにとって特に重要です。
2番目の引数はでmode
、r
デフォルトでは「読み取り専用」を意味します。それがまさにあなたがあなたの場合に必要なものです。
しかし、実際にファイルを作成したりファイルに書き込んだりする場合は、ここで別の引数が必要になります。概要が必要な場合は、優れた答えがあります。
ファイルを読み取る場合は、を省略するmode
か、明示的に渡すことができます。
open(filename)
open(filename, 'r')
どちらもファイルを読み取り専用モードで開きます。Windowsでバイナリファイルを読み込む場合は、モードを使用する必要がありますrb
。
open(filename, 'rb')
他のプラットフォームでは、'b'
(バイナリモード)は単に無視されます。
open
ファイルの操作方法を説明したので、常にclose
再び必要になるということについて話しましょう。それ以外の場合は、プロセスが終了する(またはPythonがファイルハンドルをガベージする)まで、ファイルへのオープンファイルハンドルを保持します。
あなたが使うことができる間:
f = open(filename)
# ... do stuff with f
f.close()
その間に何かが発生して例外がスローされるopen
と、ファイルを閉じることができませんclose
。あなたはtry
and を使うことでそれを避けることができますfinally
:
f = open(filename)
# nothing in between!
try:
# do stuff with f
finally:
f.close()
ただし、Pythonはよりきれいな構文を持つコンテキストマネージャーを提供します(ただし、open
それは上記try
とほぼ同じですfinally
)。
with open(filename) as f:
# do stuff with f
# The file is always closed after the with-scope ends.
最後のアプローチは、Pythonでファイルを開くための推奨アプローチです。
さて、あなたはファイルを開いたので、それをどのように読むのですか?
open
この関数は返すfile
オブジェクトを、それはニシキヘビの反復プロトコルをサポートしています。各反復はあなたに線を与えます:
with open(filename) as f:
for line in f:
print(line)
これにより、ファイルの各行が印刷されます。ただし、各行\n
の最後には改行文字が含まれていることに注意してください(Pythonがユニバーサル改行をサポートして構築されているかどうかを確認したい場合があります。それ以外の場合は\r\n
、Windowsまたは\r
Macでも改行として使用できます)。それを望まない場合は、最後の文字(またはWindowsでは最後の2文字)を削除するだけで済みます。
with open(filename) as f:
for line in f:
print(line[:-1])
しかし、最後の行には必ずしも末尾の改行があるとは限らないため、使用しないでください。末尾の改行で終わっているかどうかを確認し、そうである場合は削除します。
with open(filename) as f:
for line in f:
if line.endswith('\n'):
line = line[:-1]
print(line)
ただし、文字列\n
の末尾からすべての空白(文字を含む)を削除するだけでかまいません。これにより、他のすべての末尾の空白も削除されるため、これらが重要である場合は注意が必要です。
with open(filename) as f:
for line in f:
print(f.rstrip())
ただし、行が\r\n
(Windowsの「改行」)で終わっている場合.rstrip()
も\r
!
ファイルを開いて読み取る方法がわかったので、今度は内容をリストに保存します。最も簡単なオプションは、list
関数を使用することです。
with open(filename) as f:
lst = list(f)
末尾の改行を削除したい場合は、代わりにリスト内包表記を使用できます。
with open(filename) as f:
lst = [line.rstrip() for line in f]
あるいはもっと簡単です:オブジェクトの.readlines()
メソッドはfile
デフォルトlist
で次の行を返します:
with open(filename) as f:
lst = f.readlines()
これには、末尾の改行文字も含まれます。それらが不要な場合は[line.rstrip() for line in f]
、メモリ内のすべての行を含む2つのリストを保持しないようにするため、この方法をお勧めします。
目的の出力を取得するための追加オプションがありますが、それはむしろ「最適ではありません」:read
文字列内の完全なファイルと改行で分割:
with open(filename) as f:
lst = f.read().split('\n')
または:
with open(filename) as f:
lst = f.read().splitlines()
split
文字が含まれていないため、これらは末尾の改行を自動的に処理します。ただし、ファイルを文字列およびメモリ内の行のリストとして保持するため、これらは理想的ではありません。
with open(...) as f
自分でファイルを閉じる必要がないため、ファイルを開くときに使用します。例外が発生してもファイルを閉じます。file
オブジェクトは反復プロトコルをサポートしているため、ファイルを1行ずつ読み取るのはと同じくらい簡単for line in the_file_object:
です。readlines()
ですが、行をリストに格納する前に処理したい場合は、単純なリスト内包をお勧めします。ファイルの行をリストに読み込むクリーンでPython的な方法
何よりもまず、ファイルを開いてその内容を効率的かつpythonicな方法で読み取ることに集中する必要があります。これは私が個人的に好まない方法の例です:
infile = open('my_file.txt', 'r') # Open the file for reading.
data = infile.read() # Read the contents of the file.
infile.close() # Close the file since we're done using it.
代わりに、以下の方法でファイルを読み取りと書き込みの両方で開くことをお勧めします。ファイルは非常にクリーンであり、使用後にファイルを閉じる追加の手順を必要としないためです。以下のステートメントでは、ファイルを読み取り用に開いて、変数「infile」に割り当てています。このステートメント内のコードの実行が完了すると、ファイルは自動的に閉じられます。
# Open the file for reading.
with open('my_file.txt', 'r') as infile:
data = infile.read() # Read the contents of the file into memory.
このデータは反復可能で、効率的で、柔軟性があるため、今度はこのデータをPythonリストに取り込むことに集中する必要があります。あなたの場合、望ましい目標は、テキストファイルの各行を個別の要素にすることです。これを行うには、splitlines()メソッドを次のように使用します。
# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
最終製品:
# Open the file for reading.
with open('my_file.txt', 'r') as infile:
data = infile.read() # Read the contents of the file into memory.
# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
コードのテスト:
A fost odatã ca-n povesti,
A fost ca niciodatã,
Din rude mãri împãrãtesti,
O prea frumoasã fatã.
print my_list # Print the list.
# Print each line in the list.
for line in my_list:
print line
# Print the fourth element in this list.
print my_list[3]
['A fost odat\xc3\xa3 ca-n povesti,', 'A fost ca niciodat\xc3\xa3,',
'Din rude m\xc3\xa3ri \xc3\xaemp\xc3\xa3r\xc3\xa3testi,', 'O prea
frumoas\xc3\xa3 fat\xc3\xa3.']
A fost odatã ca-n povesti, A fost ca niciodatã, Din rude mãri
împãrãtesti, O prea frumoasã fatã.
O prea frumoasã fatã.
Python 3.4で導入されたpathlib
、次のように、ファイルからテキストを読み取るための非常に便利な方法があります。
from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()
(splitlines
呼び出しは、ファイルの内容全体を含む文字列から、ファイル内の行のリストに変更するものです)。
pathlib
便利な機能がたくさんあります。read_text
は素晴らしく簡潔なので、ファイルを開いたり閉じたりする必要はありません。ファイルを処理するために必要なことがすべて一度にすべて読み込まれる場合は、これが適切な選択です。
ファイルにリスト内包表記を使用するもう1つのオプションを次に示します。
lines = [line.rstrip() for line in open('file.txt')]
ほとんどの作業はPythonインタープリター内で行われるため、これはより効率的な方法です。
rstrip()
潜在的な; だけでなく、すべての末尾の空白を削除し\n
ます。使用します.rstrip('\n')
。
Python 2およびPython 3でテキストファイルを読み書きします。Unicodeで動作します
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Define data
lines = [' A first string ',
'A Unicode sample: €',
'German: äöüß']
# Write text file
with open('file.txt', 'w') as fp:
fp.write('\n'.join(lines))
# Read text file
with open('file.txt', 'r') as fp:
read_lines = fp.readlines()
read_lines = [line.rstrip('\n') for line in read_lines]
print(lines == read_lines)
注目すべきこと:
with
は、いわゆるコンテキストマネージャです。開いているファイルが再び閉じられることを確認します。.strip()
、単に作成するか、または.rstrip()
再生に失敗しlines
ます。一般的なファイル末尾
.txt
より高度なファイルの書き込み/読み取り
アプリケーションでは、次のことが重要になる場合があります。
構成ファイルを作成する方法を探している場合は、短い記事「Pythonでの構成ファイル」を読んでください。
別のオプションはnumpy.genfromtxt
、例えばです:
import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")
これdata
により、ファイル内の行数と同じ数のNumPy配列が作成されます。
コマンドラインまたはstdinからファイルを読み取りたい場合は、fileinput
モジュールを使用することもできます。
# reader.py
import fileinput
content = []
for line in fileinput.input():
content.append(line.strip())
fileinput.close()
そのようにそれにファイルを渡します:
$ python reader.py textfile.txt
それを行う最も簡単な方法
簡単な方法は次のとおりです。
1行で、次のようになります。
lines = open('C:/path/file.txt').read().splitlines()
ただし、これは2つのバージョンのコンテンツをメモリに保存するため、非常に非効率的な方法です(おそらく、小さなファイルでは大きな問題ではありませんが)。[Mark Ameryに感謝]。
2つの簡単な方法があります。
lines = list(open('C:/path/file.txt'))
# ... or if you want to have a list without EOL characters
lines = [l.rstrip() for l in open('C:/path/file.txt')]
pathlib
している場合は、プログラムの他の操作に使用できるファイルのパスを作成するために、より適切に使用します。from pathlib import Path
file_path = Path("C:/path/file.txt")
lines = file_path.read_text().split_lines()
# ... or ...
lines = [l.rstrip() for l in file_path.open()]
.read().splitlines()
は、単にを呼び出すよりも「単純」ではありません.readlines()
。もう1つは、メモリ効率が悪いことです。ファイルのコンテンツの2つのバージョン(によって返される単一の文字列.read()
とによって返される文字列のリストsplitlines()
)を一度にメモリに不必要に保存する必要があります。
splitlines()関数を使用するだけです。ここに例があります。
inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3
出力には、行のリストがあります。
.readlines()
。これにより、ファイルコンテンツの2つのコピーが一度にメモリに配置されます(1つは単一の巨大な文字列、もう1つは行のリスト)。
非常に大きな/巨大なファイルに直面し、より速く読みたい場合(Topcoder / Hackerrankコーディングの競争に参加していると想像してください)、一度にかなり大きな行のチャンクをメモリバッファーに読み込むのではなく、ファイルレベルで1行ずつ繰り返すだけです。
buffersize = 2**16
with open(path) as f:
while True:
lines_buffer = f.readlines(buffersize)
if not lines_buffer:
break
for line in lines_buffer:
process(line)
process(line)
データを処理するために実装する必要がある関数です。たとえば、その行の代わりにを使用print(line)
すると、lines_bufferから各行が出力されます。
lines = list(open('filename'))
または
lines = tuple(open('filename'))
または
lines = set(open('filename'))
の場合set
、行の順序が保持されず、重複する行が削除されることを忘れないでください。
.close
ファイルオブジェクトを呼び出すこともwith
ステートメントを使用することもないため、一部のPython実装では、読み取り後にファイルが閉じられず、プロセスが開いているファイルハンドルをリークする場合があります。ではCPythonの(通常のPythonファイルオブジェクトはすぐにガベージコレクションを取得しますと、これはファイルを閉じますが、それはそれにもかかわらず、一般的のような何かをすることがベストプラクティスと考えられていますので、ほとんどの人が使用することを実装)、これは問題ではありません。
with open('filename') as f: lines = list(f)
使用しているPythonの実装に関係なく、ファイルが確実に閉じられるようにします。
.close
ファイルオブジェクトを呼び出すこともwith
ステートメントを使用することもないため、一部のPython実装では、読み取り後にファイルが閉じられず、プロセスが開いているファイルハンドルをリークする場合があります。CPython(ほとんどの人が使用する通常のPython実装)では、ファイルオブジェクトがすぐにガベージコレクションされてファイルが閉じられるため、これは問題にはなりませんが、それでも、次のことwith open('filename') as f: lines = list(f)
を確実にするために何かを行うことが一般的にはベストプラクティスと見なされます。ファイルは、使用しているPython実装に関係なく閉じられます。
を使用してfilename
、Path(filename)
オブジェクトからのファイルを処理するか、直接を使用してopen(filename) as f
、次のいずれかを実行します。
list(fileinput.input(filename))
with path.open() as f
、呼び出しf.readlines()
list(f)
path.read_text().splitlines()
path.read_text().splitlines(keepends=True)
fileinput.input
またはf
そしてlist.append
時に各ライン1f
バインドされたlist.extend
メソッドに渡すf
リスト内包表記で使用する以下にそれぞれのユースケースを説明します。
Pythonでは、ファイルを1行ずつ読み取るにはどうすればよいですか?
これは素晴らしい質問です。最初に、いくつかのサンプルデータを作成します。
from pathlib import Path
Path('filename').write_text('foo\nbar\nbaz')
ファイルオブジェクトは遅延イテレータなので、反復するだけです。
filename = 'filename'
with open(filename) as f:
for line in f:
line # do something with the line
または、複数のファイルがある場合はfileinput.input
、別の遅延イテレータを使用します。ファイルが1つだけの場合:
import fileinput
for line in fileinput.input(filename):
line # process the line
または、複数のファイルの場合は、ファイル名のリストを渡します。
for line in fileinput.input([filename]*2):
line # process the line
繰り返しにf
なりfileinput.input
ますが、上記の両方は遅延遅延イテレータです。イテレータは1回しか使用できないため、冗長性を回避しながら機能コードを提供するためにfileinput.input(filename)
、ここから少し簡潔な箇所を使用します。
Pythonでは、ファイルを1行ずつリストに読み込むにはどうすればよいですか?
ああ、でも何らかの理由でリストに入れたいですか?できればそれは避けたい。しかし、あなたが主張するなら...の結果をfileinput.input(filename)
toに渡すだけですlist
:
list(fileinput.input(filename))
もう一つの直接的な答えがコールにあるf.readlines
(別売まで、ファイルの内容を返し、hint
あなたはので、文字の数ができ、複数のリストそのように、このアップを破ります)。
このファイルオブジェクトには2つの方法でアクセスできます。1つの方法は、open
組み込みにファイル名を渡すことです。
filename = 'filename'
with open(filename) as f:
f.readlines()
または、pathlib
モジュールの新しいPathオブジェクトを使用します(これは私が非常に好きになり、今後使用します):
from pathlib import Path
path = Path(filename)
with path.open() as f:
f.readlines()
list
また、ファイルイテレータを使用してリストを返します。これも非常に直接的な方法です。
with path.open() as f:
list(f)
分割する前にテキスト全体を1つの文字列としてメモリに読み込むことを気にしない場合は、Path
オブジェクトとsplitlines()
文字列メソッドを使用して、これをワンライナーとして実行できます。デフォルトでsplitlines
は、改行を削除します。
path.read_text().splitlines()
改行を保持したい場合は、次を渡しkeepends=True
ます:
path.read_text().splitlines(keepends=True)
ファイルを1行ずつ読み取り、リストの最後に各行を追加したいと思います。
いくつかの方法で簡単に最終結果を示したので、これは少し愚かなことです。しかし、リストを作成するときに、行をフィルタリングまたは操作する必要がある場合があるので、このリクエストをユーモアにつなげましょう。
を使用list.append
すると、追加する前に各行をフィルタリングまたは操作できます。
line_list = []
for line in fileinput.input(filename):
line_list.append(line)
line_list
を使用list.extend
するともう少し直接的になり、既存のリストがある場合はおそらく便利です。
line_list = []
line_list.extend(fileinput.input(filename))
line_list
または、もっと慣用的に、代わりにリスト内包表記を使用して、必要に応じてリスト内包をマッピングしてフィルタリングすることもできます。
[line for line in fileinput.input(filename)]
またはさらに直接、円を閉じるには、リストに渡して、行を操作せずに新しいリストを直接作成します。
list(fileinput.input(filename))
ファイルからリストに行を取得する多くの方法を見てきましたが、大量のデータをリストに具体化せず、可能であればPythonの遅延反復を使用してデータを処理することをお勧めします。
つまり、fileinput.input
またはを優先しwith path.open() as f
ます。
NumPyでloadtxtコマンドを使用することもできます。これはgenfromtxtよりも少ない条件をチェックするので、より高速になる場合があります。
import numpy
data = numpy.loadtxt(filename, delimiter="\n")
私は以下を使用するのが好きです。すぐに行を読みます。
contents = []
for line in open(filepath, 'r').readlines():
contents.append(line.strip())
またはリスト内包表記を使用:
contents = [line.strip() for line in open(filepath, 'r').readlines()]
readlines()
、メモリのペナルティも発生します。(テキスト)ファイルを繰り返すと各行が順番に表示されるので、単純に削除できます。
with
ステートメントを使用してファイルを開く(および暗黙的に閉じる)必要があります。
以下の方法のいずれかを試してみます。私が使用するサンプルファイルの名前はdummy.txt
です。ここでファイルを見つけることができます。ファイルはコードと同じディレクトリにあると思います(fpath
適切なファイル名とフォルダーパスを含めるように変更できます)。
以下の両方の例で、必要なリストはによって提供されlst
ます。
1.>最初の方法:
fpath = 'dummy.txt'
with open(fpath, "r") as f: lst = [line.rstrip('\n \t') for line in f]
print lst
>>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.']
2.>で第二の方法、一つは使用できcsv.reader Python標準ライブラリからモジュール。
import csv
fpath = 'dummy.txt'
with open(fpath) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=' ')
lst = [row[0] for row in csv_reader]
print lst
>>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.']
2つの方法のいずれかを使用できます。の作成にかかる時間lst
は、2つの方法でほぼ同じです。
delimiter=' '
議論ですか?
次に、ファイルI / Oを簡略化するために使用するPython(3)ヘルパーライブラリクラスを示します。
import os
# handle files using a callback method, prevents repetition
def _FileIO__file_handler(file_path, mode, callback = lambda f: None):
f = open(file_path, mode)
try:
return callback(f)
except Exception as e:
raise IOError("Failed to %s file" % ["write to", "read from"][mode.lower() in "r rb r+".split(" ")])
finally:
f.close()
class FileIO:
# return the contents of a file
def read(file_path, mode = "r"):
return __file_handler(file_path, mode, lambda rf: rf.read())
# get the lines of a file
def lines(file_path, mode = "r", filter_fn = lambda line: len(line) > 0):
return [line for line in FileIO.read(file_path, mode).strip().split("\n") if filter_fn(line)]
# create or update a file (NOTE: can also be used to replace a file's original content)
def write(file_path, new_content, mode = "w"):
return __file_handler(file_path, mode, lambda wf: wf.write(new_content))
# delete a file (if it exists)
def delete(file_path):
return os.remove() if os.path.isfile(file_path) else None
次にFileIO.lines
、次のように関数を使用します。
file_ext_lines = FileIO.lines("./path/to/file.ext"):
for i, line in enumerate(file_ext_lines):
print("Line {}: {}".format(i + 1, line))
ことを覚えておいてくださいmode
("r"
デフォルト)とfilter_fn
(デフォルトでは空行をチェック)のパラメータはオプションです。
read
、write
およびdelete
メソッドを削除して、そのままにすることもできますFileIO.lines
。または、と呼ばれる別のメソッドに変換することもできread_lines
ます。
lines = FileIO.lines(path)
本当に十分なよりも簡単with open(path) as f: lines = f.readlines()
このヘルパーの存在を正当化しますか?たとえば、通話あたり17文字を節約できます。(そして、ほとんどの場合、パフォーマンスとメモリの理由から、とにかくその行をリストに読み込むのではなく、ファイルオブジェクトを直接ループしたいので、これを頻繁に使用することすらしません!)多くの場合、小さなユーティリティ関数を作成するファンですが、これは、標準ライブラリですでに短く簡単な何かを書くための新しい方法を不必要に作成しているだけだと私には感じています。
#!/bin/python3
import os
import sys
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
filename = dname + sys.argv[1]
arr = open(filename).read().split("\n")
print(arr)
python3 somefile.py input_file_name.txt
file.readlines()
にfor
-ループ、ファイルオブジェクト自体が十分である:lines = [line.rstrip('\n') for line in file]