2013-09-28 47 views
0

我有一个标题行需要在文本文件的开头打印,然后下一行应包含有关多少有数据线。file.write()事先不知道文件长度的文件长度 - python

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

  1. 文件(即,在线路#2的第一\n
  2. 长度之前标题行之前的第二\n
  3. 未知字符串的线

问题是如何能(2)内容不知道有多少l字符串有吗?

我已经做了这样:

  1. 写标题行
  2. 写的50个" "字符的假线
  3. 写串的未知线,同时保持#lines
  4. 的计数器
  5. 寻找标题行末尾
  6. 在第二行写上#line行,让其余" "不要触碰
  7. 关闭文件(想象它上升到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() 

有没有更好的方法来做到这一点?

+0

为什么在写任何东西之前你需要知道文件长度?你为什么打印出来?例如,您是否在账单系统中列出账户数量? – octopusgrabbus

+0

更好地使用'open('testoverwrite','w')作为fout:'用于处理文件IO。 –

+0

,因为这个脚本的输出是另一个的输入,并且(2)条件对于确定下一个脚本中的选项是必不可少的。 – alvas

回答

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) 

然后在下一个写将覆盖该文件的第二个主人公线。

+0

对不起,我“试图”关注我正在处理的数据集=),更正标题寻找。 – alvas