2013-09-28 117 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