2015-10-19 35 views
2

即時通訊開發一個程序,使用線程和file.seek從互聯網下載「大文件」(從200MB到5Gb)以找到偏移量並將數據插入主文件,但當我嘗試設置2147483647字節上方的偏移量(超過C long max值)時,它會給int太大而無法轉換爲C long錯誤。我如何解決這個問題?貝婁是我的腳本代碼的代表。Python:file.seek(10000000000,2000000000)。 Python int太大,無法轉換爲C long

f = open("bigfile.txt") 

#create big file 
f.seek(5000000000-1) 
f.write("\0") 

#try to get the offset, this gives the error (Python int too large to convert to C long) 
f.seek(3333333333, 4444444444) 

我不會問(因爲它已被問了很多),如果我真的找到了解決方案。

我讀了關於將其轉換爲int64並使用類似UL的東西,但我沒有真正理解它。我希望你能幫助或者至少試着讓我的頭腦更清晰。的xD

+0

我不知道如何解決你的主要問題,但這裏有一個相關的觀察:我不認爲尋求和寫入文件實際上會「插入」文本 - 相反,我認爲它會覆蓋現有文本在尋求點 – inspectorG4dget

+0

我明白你的意思和它的正確性。我試圖做的是創建一個無用數據的5GB文件(大小取決於下載文件的大小),然後使用指向指定偏移量的file.seek用正確的數據覆蓋它(因爲文件是用幾個線程,我需要將數據寫入該文件的正確位置)。我想我沒有對自己解釋得那麼好。但是,感謝您的回覆;) –

+0

打開文件進行寫入,尋找長途,然後寫入文件在許多文件系統上幾乎不分配空間。結果是一個[稀疏文件](https://en.wikipedia.org/wiki/Sparse_file),它的i節點長度很長,但沒有分配給它的實際磁盤塊。要實際預先分配空間,您需要寫入要分配的每個塊。 – msw

回答

4
f.seek(3333333333, 4444444444) 

這第二個參數應該是from_where說法,口述無論你是尋求:

  • 文件開始,os.SEEK_SET0;
  • 當前位置,os.SEEK_CUR1;
  • 該文件的末尾,os.SEEK_END2

4444444444不是其中一個允許值。

下面的程序工作正常:如預期

import os 
f = open("bigfile.txt",'w') 
f.seek(5000000000-1) 
f.write("\0") 
f.seek(3333333333, os.SEEK_SET) 
print f.tell()     # 'print(f.tell())' for Python3 

和輸出3333333333

+0

謝謝!它工作,我想我沒有真正理解文檔,我想,與尋求我可以從文件中獲得數據的偏移量。 (4444444444 - 3333333333):) :) :) –

+1

@ user3754262:傳遞'os.SEEK_ *'常量作爲第二個參數。 – jfs

+0

@ J.F.Sebastian,很好的建議,將其納入答案。 – paxdiablo

相關問題