0

次の問題があります。ファイルx、y、zを次のように読んでいます:

481492.93 6244326.24 26.56
481493.03 6244325.60 25.06
481493.17 6244324.68 22.89
481493.50 6244322.52 17.80
481492.84 6244327.05 27.84
481492.90 6244326.66 26.90
481492.86 6244327.16 27.45
481493.48 6244323.08 17.79
481492.80 6244327.80 28.30
481492.94 6244326.84 26.04
..........................

同じファイルを読み書きしたい(元のファイルが10GB以上あるのでバックアップファイルを作成せずに)

481492.93 6244326.24 26.56 (375, 2902)
481493.03 6244325.60 25.06 (376, 2902)
481493.17 6244324.68 22.89 (377, 2902)
481493.50 6244322.52 17.80 (379, 2903)
481492.84 6244327.05 27.84 (375, 2902)
481492.90 6244326.66 26.90 (375, 2902)
481492.86 6244327.16 27.45 (374, 2902)
481493.48 6244323.08 17.79 (379, 2903)
481492.80 6244327.80 28.30 (374, 2902)
481492.94 6244326.84 26.04 (375, 2902)
..........................

私は次のアプローチを書きました

def get_point_grid_id(x,y,x_min,y_max,x_dist,y_dist):
        col = int((x - x_min)/x_dist)
        row = int((y_max - y)/y_dist)
        return (row, col)

with open(file_temp, "r+") as f:
    for line in open(file_temp):
        x,y,z = line.split()
        id = get_point_grid_id(float(x),float(y),origin[0],origin[1],1,1)
        element = [x,y,z,id]
        newelement = " ".join([str(e) for e in element])+ "\n"
        f.write(newelement)

関数を実行すると、次のエラーが発生しました

Traceback (most recent call last):
  File "<editor selection>", line 3, in <module>
ValueError: too many values to unpack

元のファイルとの接続の問題だと思います

エラーが表示されます

>>> x,y,z = line.split()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
ValueError: too many values to unpack

どこlineがおかしい

'481499.82 6244470.31 29.23 (231, 2909)\n' 

それ以外の '481499.82 6244470.31 29.23\n'

新しいファイルから実行した後にこの印刷物を取得しprint lineた後に使用するfor line in open(file_temp):

481499.98 6244494.02 34.14
481499.98 6244494.02 34.14 (208, 2909)
481499.96 6244471.05 33.39
481499.96 6244471.05 33.39 (231, 2909)
481499.95 6244471.27 33.46
481499.95 6244471.27 33.46 (230, 2909)
481499.98 6244473.84 32.72
481499.98 6244473.84 32.72 (228, 2909)
481499.98 6244474.07 32.70
481499.98 6244474.07 32.70 (228, 2909)
481499.97 6244474.28 32.93
481499.97 6244474.28 32.93 (227, 2909)
481499.88 6244474.40 34.35
481499.88 6244474.40 34.35 (227, 2909)
4

2 に答える 2

1

これはうまくいきません。Martijnが言ったように、

fileオブジェクトにはバッファ位置があります。文字を読み取るたびに、バッファ位置が1ずつ進みます。10文字の長さの行を読み取ったとします。

>>> myfile = open('some_file.txt')
>>> myfile.tell() #gets the buffer position
0
>>> myfile.readline()
'012345678\n'

これで、バッファ位置がlen(line)文字単位で進められます。

>>> myfile.tell()
10

これは、を呼び出すとmyfile.write()、位置10から書き込みを開始することを意味します。

II

何かを上書きしたり、最後に文字を追加したりせずに、ファイルに文字を「挿入」することはできません(バッファ位置がファイルの最後にあると仮定します)。

それで、あなたは何をしますか?

一時ファイルを作成すると同時に、入力ファイルから読み取り、一時ファイルに書き込むことができます。その後(必要に応じて)、元のファイルを一時ファイルに置き換えることができます。

with open(input_file) as infile, open(output_temp_file, "w") as outfile:
    for line in infile:
        x, y, z = line.split()
        new_line = ' '.join([x, y, z] + [function_of_xyz(x, y, z)]) + '\n'
        outfile.write(new_line)

csvモジュールもチェックアウトする必要があります。

于 2013-02-22T21:41:02.143 に答える
1

行を r+ モードで開くということは、行を読み取ったこと、つまり 38 文字を読み取ったことを意味します。次に、これらの 38 文字を変更します 次に、現在のファイル位置 (文字 39) で、既存のデータを上書きします

これはあなたが望むものではないと思います

お役に立てれば

于 2013-02-22T21:26:51.473 に答える