0

我有一个需要在文本文件开头打印的标题行,然后下一行应该包含有关有多少行数据的信息。

最终输出文件应包含以下内容:

  1. 第一个之前的标题行\n
  2. 文件的长度(即第二行之前的行数\n
  3. 字符串的未知行

问题是如何在不知道有多少行字符串的情况下满足 (2) 内容?

我一直在这样做:

  1. 写标题行
  2. " "写一个 50 个字符的假行
  3. 在保持#lines 计数器的同时写入未知的字符串行
  4. 寻找到标题行的末尾
  5. 在第二行写 #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()

pos此时可能相等也可能不相等len(header) + 1(取决于平台)。但是稍后寻找它到达标题后面的行的开头。所以更换你的:

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

(这很奇怪,因为那不是你之前写的标题行):

fout.seek(pos)

然后下一次写入将覆盖文件第二行中的前导字符。

于 2013-09-28T19:16:48.290 回答