2011-08-23 83 views
2

我一直在試圖從一個文件複製長文本到另一個文件,但它總是複製我只是其中的一小部分。它看起來像我可以解決的極限問題。讀/寫文件問題

如果有人能夠幫助我解釋哪些是我的錯誤,我會很高興。

def runMenu(): 

print "\nMENU" 
print " 1) Copiar" 
print " 0) Exit" 

response = int(raw_input().strip()) 

if response == 1: 
    print "Copiar"  
    try: 

     archivo=open("D:\Boot.txt","r") 
     print "Name of the file: ", archivo.name 
     print "Closed or not : ", archivo.closed 
     print "Opening mode : ", archivo.mode 

     print "--------ORIGEN-----------" 
     print archivo.read() 
     print "-------------------------" 
     archivo.seek(0, 0) 


     archivo2=open("D:\Copia.txt","w+") 
     print "Name of the file: ", archivo2.name 
     print "Closed or not : ", archivo2.closed 
     print "Opening mode : ", archivo2.mode 



     archivo2.write(archivo.read()) 

     archivo2.seek(0, 0) 
     print "---------DESTINO---------" 
     print archivo2.read() 
     print "-------------------------" 
     archivo.close() 
     archivo2.close() 

    except IOError: 
     print ("I/O Error de Lectura") 
    else: 
     print "Lectura OK" 

elif response == 0: 
    #device.close() 
    print "Exit" 

return response 

def main(): 
    print "main" 
    while(1): 
     if runMenu() == 0: break 

main() 
+2

雖然這不是直接回答你的問題,如果你只是想複製文件到新的位置,而無需修改任何東西,你有沒有看着[這些](http://docs.python.org/library/shutil .html#目錄和文件操作)方法?他們應該爲你做所有的工作。 –

+0

和你從 –

回答

-1

也許你有超過一次調用讀/寫功能(archivo2.write(archivo.read()) )。 試着讓它在循環中並複製文件數據,直到「Eof」(文件結束)。 使用一個循環,這樣的事情:

while not Eof(archivo) do 
... 
+0

複製的文件大小是多少?你確定嗎?在[documentation](http://docs.python.org/library/stdtypes.html#file.read)中,它表示「如果size參數爲負值或省略,請讀取所有數據,直到達到EOF。」 - 但我沒有自己測試過,所以你可能是絕對正確的,在這種情況下,不要理我的評論:) –

2

使用shutil.copy()

http://docs.python.org/library/shutil.html#shutil.copy

shutil.copy(SRC,DST)

複製文件src的文件或目錄DST。如果dst是目錄,則在指定的目錄中創建(或覆蓋)與src具有相同基本名稱的文件。權限位被複制。 src和dst是以字符串形式給出的路徑名。

-Sunjay03

+0

這絕對是「真正」代碼的方式,但是從OP的程序看起來,就像他正在嘗試示例代碼一樣。 –

0

是您的文件由二進制和文字沒有任何機會呢?它可以解釋爲什麼只有一部分文件被複制。無論如何,我建議使用已經提到的方法進行復制。

0

當您在文本模式下打開的文件上使用fseek()ftell()時,Windows(至少包括XP,不知道Vista和7)可以做出奇怪的事情。由於Python函數seek()tell()只是這些函數的相對較薄的包裝器,所以這也適用於它們。

我發現在Windows中執行文件I/O時,最好的做法是以二進制模式打開所有文件。所以,而不是open('somefile.txt', 'r'),你會做open('somefile.txt', 'rb')open('some_other_file.txt','w+b')

以二進制模式打開文件沒有真正的缺點,但解決這樣的怪異。

0

這四行很有趣......

  1. archivo2.write(archivo.read())
  2. archivo2.seek(0, 0)
  3. print archivo2.read()
  4. archivo2.close()

在第一行,你泵一些數據輸出到文件;一路上,操作系統有助於緩衝,使流程更加高效。最後,一些數據已寫入磁盤,但其中一些數據仍在緩衝區中等待緩衝區填滿。

在第2行上,將文件重新定位在文件的前面,並在第3行上,您讀取,直到文件結束。你從來沒有做過任何會導致緩衝區寫入磁盤的事情。

在第4行,關閉文件,但緩衝區已失效。

你可以告訴巨蟒,你想都在一個文件的緩衝區寫入磁盤的內容,與file.flush()。在第1行和第2行之間添加archivo2.flush()會發生什麼?