file.write()文件的长度,不知道文件的长度 - python

时间:2013-09-28 18:46:20

标签: python file-io

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

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

  1. 第一个\n
  2. 之前的标题行
  3. 文件的长度(即第二个\n
  4. 之前的行数#
  5. 未知的字符串
  6. 问题是如何在不知道有多少行字符串的情况下如何满足(2)内容?

    我一直这样做:

    1. 写标题行
    2. 写一个假的50行" "个字符
    3. 在保留#lines
    4. 的计数器的同时写出未知的字符串
    5. 寻找标题行的末尾
    6. 在第二行写下#line行,留下" "的其余部分取消
    7. 关闭文件(想象它最多可达到19GB的字符串)
    8. 为了举例,我使用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()
      

      有更好的方法吗?

1 个答案:

答案 0 :(得分: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)

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