web-dev-qa-db-ja.com

pythonのテキストファイルから特定の列を読み取る

私は数字で構成されるテーブルを含むテキストファイルを持っています:

5 10 6

6 20 1

7 30 4

8 40 3

9 23 1

4 13 6

たとえば、2番目の列にのみ数字を含める場合、その列をリストに抽出するにはどうすればよいですか?

16
Jethro
_f=open(file,"r")
lines=f.readlines()
result=[]
for x in lines:
    result.append(x.split(' ')[1])
f.close()
_

リスト内包表記を使用しても同じことができます

_print [x.split(' ')[1] for x in open(file).readlines()]
_

split()のドキュメント

string.split(s[, sep[, maxsplit]])

文字列sの単語のリストを返します。オプションの2番目の引数sepが存在しないかNoneの場合、単語は空白文字の任意の文字列(スペース、タブ、改行、リターン、フォームフィード)で区切られます。 2番目の引数sepが存在し、Noneではない場合、Wordセパレータとして使用される文字列を指定します。返されるリストには、文字列内のセパレータの重複しない出現数よりも1つ多くの項目があります。

したがって、使用したスペースを省略してx.split()だけを実行できますが、これはタブと改行も削除することに注意してください。

22
ForceBru

スペースで区切られたファイルがあるため、区切られた値のファイルを読み取るために設計されたモジュール csv を使用します。

_import csv

with open('path/to/file.txt') as inf:
    reader = csv.reader(inf, delimiter=" ")
    second_col = list(Zip(*reader))[1]
    # In Python2, you can omit the `list(...)` cast
_

Zip(*iterable)パターンは、行を列に、またはその逆に変換するのに役立ちます。ファイルを行ごとに読んでいる場合...

_>>> testdata = [[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]]

>>> for line in testdata:
...     print(line)

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
_

...しかし、列が必要な場合、各行をZip関数に渡すことができます

_>>> testdata_columns = Zip(*testdata)
# this is equivalent to Zip([1,2,3], [4,5,6], [7,8,9])

>>> for line in testdata_columns:
...     print(line)

[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
_
8
Adam Smith

リスト内包表記でZip関数を使用できます:

with open('ex.txt') as f:
    print Zip(*[line.split() for line in f])[1]

結果:

('10', '20', '30', '40', '23', '13')
4
Kasramvd

これは古い質問ですが、データが配列のように見える場合、numpyの loadtxt が役立つと誰も言及していません。

>>> import numpy as np
>>> np.loadtxt("myfile.txt")[:, 1]
array([10., 20., 30., 40., 23., 13.])
4
aerobiomat

まずファイルを開き、datafileとして.read()メソッドを適用してファイルの内容を読み取り、次にデータを分割して次のような結果を返します:['5', '10', '6', '6', '20', '1', '7', '30', '4', '8', '40', '3', '9', '23', '1', '4', '13', '6']そして、このリストにリストスライスを適用して、インデックス位置1の要素から開始し、ループの最後に到達するまで次の3つの要素をスキップします。

with open("sample.txt", "r") as datafile:
    print datafile.read().split()[1::3]

出力:

['10', '20', '30', '40', '23', '13']
3
ZdaR

役立つかもしれません:

import csv
with open('csv_file','r') as f:
    # Printing Specific Part of CSV_file
    # Printing last line of second column
    lines = list(csv.reader(f, delimiter = ' ', skipinitialspace = True))
    print(lines[-1][1])
    # For printing a range of rows except 10 last rows of second column
    for i in range(len(lines)-10):
        print(lines[i][1])