Pythonでファイルのすべての行を読み取り、各行をリストの要素として格納する方法を教えてください。
ファイルを1行ずつ読み取り、リストの末尾に各行を追加します。
with open(fname) 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]
入力と出力 :を参照してください。
with open('filename') as f:
lines = f.readlines()
または改行文字を取り除きます。
lines = [line.rstrip('\n') for line in open('filename')]
編集者注:Janus Troelsenのコメントが暗示しているように、この回答の最初の空白削除コマンドline.strip()
は、末尾の\n
だけでなく、 すべての先頭と末尾の 空白を削除します。
これは必要以上に明白ですが、あなたが望むことをします。
with open("file.txt", "r") as ins:
array = []
for line in ins:
array.append(line)
これにより、ファイルから行の「配列」が生成されます。
lines = Tuple(open(filename, 'r'))
\n
を含めたい場合は、
with open(fname) as f:
content = f.readlines()
\n
を含めたくない場合は、
with open(fname) as f:
content = f.read().splitlines()
提案されているように、あなたは単に以下をすることができます:
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パスであなたのファイルを通過します。これは一般的に一般的なパーサがどのように動作するかです。
あなたがファイルを閉じることを気にしないのなら、このワンライナーはうまくいきます:
lines = open('file.txt').readlines()
伝統的な way:
fp = open('file.txt') # Open file on read mode
lines = fp.read().split("\n") # Create a list containing all lines
fp.close() # Close file
with
とreadlines()
の使用(推奨) :
with open('file.txt') as fp:
lines = fp.readlines()
リストにデータ
次のようなデータを含むテキストファイルがあるとします。
line 1
line 2
line 3
python
を実行し、インタプリタで次のように書きます。>>> with open("myfile.txt", encoding="utf-8") as file:
... x = [l.strip() 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']
>>> y = [x.rstrip() for x in open("my_file.txt")]
>>> y
['line 1','line 2','line 3']
with open('testodiprova.txt', 'r', encoding='utf-8') as file:
file = file.read().splitlines()
print(file)
with open('testodiprova.txt', 'r', encoding='utf-8') as file:
file = file.readlines()
print(file)
これはopenコマンドをカプセル化するはずです。
array = []
with open("file.txt", "r") as f:
for line in f:
array.append(line)
ファイルをリストに読み込むには、次の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)
ファイル拡張子を指定する必要があることに注意してください。これは、Windowsユーザーにとって特に重要です。なぜなら、.txt
や.doc
などのファイル拡張子は隠されていますデフォルトエクスプローラーで表示されるとき。
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
と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でファイルを開くためのrecommendedアプローチです!
さて、あなたはファイルを開きました、今それをどのように読みますか?
open
関数は file
オブジェクトを返し、Pythonの反復プロトコルをサポートします。反復ごとに次の行が表示されます。
with open(filename) as f:
for line in f:
print(line)
これにより、ファイルの各行が印刷されます。ただし、各行には末尾に改行文字\n
が含まれることに注意してください(Pythonが ユニバーサル改行サポート で構築されているかどうかを確認することをお勧めします。 Windowsでは\r\n
、Macでは\r
も改行として使用します)。必要ない場合は、最後の文字(または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]
またはもっと簡単:file
オブジェクトの .readlines()
メソッドは、デフォルトで行の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()
ですが、リストに保存する前に行を処理する場合は、単純なリストの理解をお勧めします。ファイルの行をリストに読み込むためのクリーンでPythonicな方法
まず第一に、あなたはあなたのファイルを開きそして効率的で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 List にまとめることに集中する必要があります。なぜなら、それらは反復可能、効率的、そして柔軟なためです。あなたの場合、望ましい目標はテキストファイルの各行を別々の要素にすることです。これを達成するために、次のように 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ã.
私はこうしたいのですが。
lines = []
with open("myfile.txt") as f:
for line in f:
lines.append(line)
ファイルにリスト内包表記を使用することによるもう1つのオプションがあります。
lines = [line.rstrip() for line in open('file.txt')]
ほとんどの作業はPythonインタプリタの内部で行われるため、これはより効率的な方法です。
別のオプションは numpy.genfromtxt
です、例えば:
import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")
これはdata
をあなたのファイルにあるのと同じ数の行を持つNumPy配列にします。
コマンドラインまたは標準入力からファイルを読みたい場合は、fileinput
モジュールも使用できます。
# reader.py
import fileinput
content = []
for line in fileinput.input():
content.append(line.strip())
fileinput.close()
ファイルを次のように渡します。
$ python reader.py textfile.txt
ここでもっと読んでください: http://docs.python.org/2/library/fileinput.html
最も簡単な方法
簡単な方法は:
一行で言えば、
lines = open('C:/path/file.txt').read().splitlines()
#!/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の設定ファイルを読んでください。
Python 3.4で導入された pathlib
は、ファイルからテキストを読み込むのに非常に便利な方法です。
from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()
(splitlines
呼び出しは、ファイルの内容全体を含む文字列からファイル内の行のリストに変換するものです)。
pathlib
には便利な機能がたくさんあります。 read_text
は素晴らしく簡潔で、ファイルの開閉について心配する必要はありません。ファイルを処理するために必要なことがすべて一度にすべて読み取られるのであれば、それは良い選択です。
f = open("your_file.txt",'r')
out = f.readlines() # will append in the list out
今すぐ変数outはあなたが欲しいもののリスト(配列)です。どちらでもできます。
for line in out:
print line
または
for line in f:
print line
あなたは同じ結果を得るでしょう。
Splitlines()関数を使うだけです。これが一例です。
inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3
出力には行のリストがあります。
本当に簡単な方法:
with open(file) as g:
stuff = g.readlines()
本格的なプログラムにしたい場合は、次のように入力してください。
file = raw_input ("Enter EXACT file name: ")
with open(file) as g:
stuff = g.readlines()
print (stuff)
exit = raw_input("Press enter when you are done.")
何らかの理由で、それは.pyファイルを正しく読みません。
次のようにしてファイルを開いて読むことができます。
file1 = open("filename","r")
# And for reading use
lines = file1.readlines()
file1.close()
リストlines
はすべての行を個々の要素として含み、Pythonが0からカウントを始めるのでlines["linenumber-1"]
を使って特定の要素を呼び出すことができます。
非常に大きい/巨大なファイル に直面したい場合、 もっと早く読みたい場合 (Topcoder/Hackerrankコーディングコンペティションに参加していると想像してください)ファイルレベルで1行ずつ繰り返すのではなく、一度に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)
私の知る限りでは、Pythonはネイティブの配列データ構造を持っていません。しかし、それは配列よりもはるかに使いやすいリストデータ構造をサポートします。
array = [] #declaring a list with name '**array**'
with open(PATH,'r') as reader :
for line in reader :
array.append(line)
いくつかの追加の利点とそれを行うための最も簡単な方法は次のとおりです。
lines = list(open('filename'))
または
lines = Tuple(open('filename'))
または
lines = set(open('filename'))
set
の場合、行の順番を保存せずに重複した行を取り除くことを忘れないでください。
次のようなコードで簡単に実行できます。
lines = open(filePath).readlines()
これが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
という別のメソッドに変換することもできます。
これを使って:
import pandas as pd
data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc.
array = data.values
data
はデータフレーム型で、ndarrayを取得するために値を使用します。 array.tolist()
を使ってリストを取得することもできます。
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
を各行ごとに繰り返し処理しますf
をバインドされた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)
の結果をlist
に渡すだけです:
list(fileinput.input(filename))
別の直接的な答えは、f.readlines
を呼び出すことです。これは、ファイルの内容(オプションのhint
文字数までを返すため、couldこの方法で複数のリストに分割します)。
このファイルオブジェクトには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)
分割する前にテキスト全体を単一の文字列としてメモリに読み込むことを気にしない場合は、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
を優先します。
この短いスニペットをチェックしてください
fileOb=open("filename.txt","r")
data=fileOb.readlines() #returns a array of lines.
または
fileOb=open("filename.txt","r")
data=list(fileOb) #returns a array of lines.
reference docs 参照用
NumPyでloadtxtコマンドを使用することもできます。これはgenfromtxtより少ない条件をチェックするので、速いかもしれません。
import numpy
data = numpy.loadtxt(filename, delimiter="\n")
私は下記の方法の一つを試すでしょう。私が使用するサンプルファイルはdummy.txt
という名前です。ファイル here を見つけることができます。ファイルはコードと同じディレクトリにあると思います(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.> 2番目の方法 では、Python標準ライブラリのcsv.reader モジュールを使用できます :
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つの方法でほぼ同じです。
私は以下を使うのが好きです。すぐに行を読みます。
contents = []
for line in open(filepath, 'r').readlines():
contents.append(line.strip())
あるいはリスト内包表記を使う:
contents = [line.strip() for line in open(filepath, 'r').readlines()]
#!/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
空の文字列要素を防ぐために、私は内容を読み、それをfilter
に渡したいと思う文書に空の行もある場合
with open(myFile, "r") as f:
excludeFileContent = list(filter(None, f.read().splitlines()))