0

テキストファイルの先頭に出力する必要があるヘッダー行があり、次の行には、データの行数に関する情報が含まれている必要があります。

最終的な出力ファイルには、次の内容が含まれている必要があります。

  1. 最初の前のヘッダー行\n
  2. ファイルの長さ (つまり、2 番目より前の行数\n
  3. 文字列の未知の行

問題は、(2) 文字列の行数を最初に知らずに、どうすればコンテンツを満たすことができるかということです。

私はそのようにしてきました:

  1. ヘッダー行を書く
  2. " "50文字の偽の行を書く.
  3. #lines のカウンターを保持しながら、文字列の不明な行を書き込みます
  4. ヘッダー行の最後までシークする
  5. 2 行目に #line 行を書き、残りはその" "ままにします
  6. ファイルを閉じます (最大 19GB 相当の文字列になると想像してください)

例のために、私は行数を生成するために使用random.random()し、私はこのようにしてきました:

import random
fout = open('testoverwrite','w')

header = "%% this is a header line"

print>>fout, header
print>>fout, "".join((" ")*50)

total = 0
numrows = int(100*random.random())
for i in range(numrows):
    j = int(100*random.random())
    total+=j
    print>>fout, j

fout.seek(len("%% this is a header line\n"))
#print len(str(numrows)+" "+str(total))
if len(str(numrows)+" "+str(total)) < 50:
    fout.write(str(numrows)+" "+str(total))

fout.close()

これを行うより良い方法はありますか?

4

1 に答える 1

3

ええと、なぜこれをやりたいのかわかりませんが、もしそうしなければならない場合は ;-) これがクロスプラットフォームでseek()機能するためには、テキストモードで開かれたファイルで機能すると思うように常に機能するとは限りません. これをテキスト モード ファイルで確実に動作させるには、seek()以前にtell(). したがって、ヘッダー行を書いた後、次のようにします (例):

print>>fout, header
pos = fout.tell()

poslen(header) + 1この時点で等しい場合と等しくない場合があります (プラットフォームによって異なります)。ただし、後で検索するとヘッダーに続く行の先頭に到達します。だからあなたを置き換えます:

fout.seek(len("%% this is the header line\n"))

(それはあなたが以前に書いたヘッダー行ではないので、とにかくかなり奇妙です):

fout.seek(pos)

その後、次の書き込みで、ファイルの 2 行目の先頭文字が上書きされます。

于 2013-09-28T19:16:48.290 に答える