これらのファイルを継承またはダウンロードしたばかりで、フォーマットについて何もできず、それらが Pythonlist
の行として扱われることになっていることがわかっている場合ast.literal_eval
は、steveha が説明したように、これが最良の答えです。
t = open('filename.txt', 'r')
alist = []
for i in contents:
alist.append(ast.literal_eval(i))
これらのファイルを継承またはダウンロードし、形式を推測しているだけの場合、実際には JSON の行として読み取られることを意図している可能性があります。これは、有効な Python リテラルであるのと同様に、それらが間違いなく有効な JSON であるためです。その場合:
t = open('filename.txt', 'r')
alist = []
for i in contents:
alist.append(json.loads(i))
ただし、これらのファイルを最初に作成したのが自分である場合は、シリアル化用に設計された方法でファイルを作成する必要があります。
たとえば、これの代わりに:
t = open('filename.txt', 'w')
for i in alist:
print >>t, i
次のようにします。
t = open('filename.txt', 'w')
json.dump(alist, t)
次に、読み取りコードを次のように記述できます。
t = open('filename.txt', 'r')
alist = json.load(t)
JSON、YAML、または Pickle などのシリアル化形式の要点は、値を書き込んで後で同じ値を読み戻せるように特別に設計されていることです。
、 などのprint
関数はそのために設計されていません。後で読み返すことが困難または不可能な場合でも、人間が読める形式で値を表示できるように設計されています。str
関数repr
はその中間にあります。これは、対話型プロンプトで遊んでいる人間が読めるように設計されているため、可能であれば、プロンプトに入力して同じ値を取得できる文字列を提供します。これは、が の逆であるのと同様に、 がのast.literal_eval
逆である場合があることを意味します。ただし、これが機能する型を扱う場合でも、これに依存するべきではありません。repr
json.load
json.dump
コードに関するいくつかの補足事項:
t = open('filename.txt', 'r+w')
ファイルを読み取るだけの場合は、書き込み用にファイルを開こうとしないでください。また、読み取りと書き込みの両方で開きたい場合、正しいモード文字列はではr+
なくr+w
です。(あなたが行った方法は技術的にはエラーですが、ほとんどのバージョンの Python は を無視するw
ので、問題はありません。)
モードがr
の場合は、それがデフォルトであるため、指定する必要はまったくありません。
その間、あなたは決してclose
ファイルを持っていません。これを行う最も簡単な方法は、with
ステートメントを使用することです。
contents = t.readlines()
電話する正当な理由はほとんどありませんreadlines()
。これにより一連の行が得られますが、ファイル自体はすでに一連の行です。あなたがしているのは、それの追加のコピーを作成することだけです。
alist = []
for i in contents:
alist.append(i)
このパターン (空のリストを作成し、ループ内でそれに追加する) は非常に一般的であるため、Python にはリスト内包表記と呼ばれるショートカットがあります。内包表記は、明示的なループよりも冗長でなく、読みやすく、間違えにくく、高速であるため、ほとんどの場合に使用する価値があります。
最後に、変数に意味のある名前を付けることをお勧めします。特に、他の誰か (または 6 か月後の自分自身) にコードをデバッグしてもらいたい場合。変数が完全に機能している場合は、変数が何を意味するかを知ることができますが、そうでない場合は、変数が何を意味するのかを推測できない限り、変数を修正することはできず、名前はそれを示す最良の方法です.
したがって、すべてをまとめると、元のコードは次のように記述できます。
with open('filename.txt') as textfile:
alist = [line for line in textfile]
そして、さまざまな修正バージョンは次のとおりです。
with open('filename.txt') as textfile:
alist = [ast.literal_eval(line) for line in textfile]
with open('filename.txt') as textfile:
alist = [json.loads(line) for line in textfile]
with open('filename.txt') as textfile:
alist = json.load(textfile)