4

これは些細な質問かもしれませんが、さまざまな方法でこれを解決しようと一日を費やしてきました。次のようなデータを含むファイルがあります。

<string>
<integer>
<N1>
<N2>
data
data
...
<string>
<integer>
<N3>
<N4>
data
data
...

そして、それは何度も拡張されます...最初のセット(最初と2番目の間)の「データ」を読み取る必要があります。これには、Xポイントの数N1、Yポイントの数N2、およびN1 * N2の数が含まれますZ ポイントの。データのセットが 1 つしかない場合、すべてのデータを読み取る方法を既に知っています。次に、値 N1、N2 を読み取り、それを X、Y、Z にスライスし、形状を変更して使用します... 1 つのデータ セットよりも多くの場合、1 つの文字列から次の文字列までのみを読み取り、次のセットに対して同じ操作を繰り返し、ファイルの最後に到達するまで繰り返すにはどうすればよいですか? 私は次のような関数を定義しようとしました:

def dat_fun():
    with open("inpfile.txt", "r") as ifile:
        for line in ifile:
            if isinstance('line', str) or (not line):
                break
            for line in ifile:
                yield line

が機能していません。データのない配列を取得します。コメントをお待ちしております。ありがとう!

4

3 に答える 3

7

すべての行は のインスタンスでstrあるため、最初の行でブレークアウトします。そのテストを削除し、最初に空白を取り除いて空行をテストします。

def dat_fun():
    with open("inpfile.txt", "r") as ifile:
        for line in ifile:
            if not line.strip():
                break
            yield line

空行で改行する必要はないと思います。ループはファイルの最後でfor自然に終了します。

行に他の種類のデータが含まれている場合は、文字列から変換する必要があります。

于 2013-07-02T22:14:48.780 に答える
3

このような構造化データでは、必要なものだけを読むことをお勧めします。例えば:

with open("inpfile.txt", "r") as ifile:
    first_string = ifile.readline().strip() # Is this the name of the data set?
    first_integer = int(ifile.readline()) # You haven't told us what this is, either
    n_one = int(ifile.readline())
    n_two = int(ifile.readline())

    x_vals = []
    y_vals = []
    z_vals = []

    for index in range(n_one):
         x_vals.append(ifile.readline().strip())
    for index in range(n_two):
         y_vals.append(ifile.readline().strip())
    for index in range(n_one*n_two):
         z_vals.append(ifile.readline().strip())

ループを追加して値を生成することで、これをデータセット生成関数に変えることができます。

with open("inpfile.txt", "r") as ifile:
    while True:
        first_string = ifile.readline().strip() # Is this the name of the data set?
        if first_string == '':
            break
        first_integer = int(ifile.readline()) # You haven't told us what this is, either
        n_one = int(ifile.readline())
        n_two = int(ifile.readline())

        x_vals = []
        y_vals = []
        z_vals = []

        for index in range(n_one):
            x_vals.append(ifile.readline().strip())
        for index in range(n_two):
            y_vals.append(ifile.readline().strip())
        for index in range(n_one*n_two):
            z_vals.append(ifile.readline().strip())
        yield (x_vals, y_vals, z_vals) # and the first string and integer if you need those
于 2013-07-02T22:30:29.497 に答える
1
def dat_fun():
    with open("inpfile.txt", "r") as ifile:
        for line in ifile:
            if isinstance('line', str) or (not line): # 'line' is always a str, and so is the line itself
                break 
            for line in ifile:
                yield line

これを次のように変更します。

def dat_fun():
    with open("inpfile.txt", "r") as ifile:
        for line in ifile:
            if not line:
                break
            yield line
于 2013-07-02T22:16:25.050 に答える