0

txt ファイル内のすべての行の欠落の発生をカウントしたいと思います。

foo.txtファイル:

1 1 1 1 1 NA    # so, Missings: 1
1 1 1 NA 1 1    # so, Missings: 1
1 1 NA 1 1 NA   # so, Missings: 2  

しかし、最初の行の要素の量も取得したいと思います (これがすべての行で等しいと仮定します)。

miss = []
with open("foo.txt") as f:
    for line in f:
        miss.append(line.count("NA"))

>>> miss
[1, 1, 2]         # correct

問題は、要素の量を特定しようとするときです。私は次のコードでこれを行いました:

miss = []
with open("foo.txt") as f:
    first_line = f.readline()
    elements = first_line.count(" ")  # given that values are separated by space
    for line in f:
        miss.append(line.count("NA"))

>>> (elements + 1)
6   # True, this is correct          
>>> miss 
[1,2]  # misses the first item due to readline() removing lines.`

次の操作のために最初の行を削除せずに、最初の行を一度読み取るにはどうすればよいですか?

4

3 に答える 3

2

すべての行にアイテムの数がある場合、最後の行でアイテムを数えることができます。

miss = []
with open("foo.txt") as f:
    for line in f:
        miss.append(line.count("NA")
    elements = len(line.split())

数えるより良い方法は、おそらく次のとおりです。

elements = len(line.split())  

これは、複数のスペースまたはタブで区切られたアイテムもカウントするためです。

于 2013-06-03T08:59:48.010 に答える
2

試してみてくださいf.seek(0)。これにより、ファイル ハンドルがファイルの先頭にリセットされます。

完全な例は次のようになります。

miss = []
with open("foo.txt") as f:
    first_line = f.readline()
    elements = first_line.count(" ")  # given that values are separated by space
    f.seek(0)
    for line in f:
        miss.append(line.count("NA"))

さらに良いのは、最初の行も含めてすべての行を 1 回だけ読み取り、要素数を 1 回だけチェックすることです。

miss = []
elements = None
with open("foo.txt") as f:
    for line in f:
        if elements is None:
            elements = line.count(" ")  # given that values are separated by space
        miss.append(line.count("NA"))

ところで:要素の数は ではないでしょうline.count(" ") + 1か?

を使用することをお勧めしlen(line.split())ます。これは、タブ、ダブル スペース、先頭/末尾のスペースなども処理するためです。

于 2013-06-03T08:49:51.140 に答える
0

最初の行を別々に扱うこともできます

with open("foo.txt") as f:
    first_line = next(f1)
    elements = first_line.count(" ")  # given that values are separated by space
    miss = [first_line.count("NA")]
    for line in f:
        miss.append(line.count("NA")
于 2013-06-03T08:55:42.957 に答える