2011-08-23 5 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 # directory-and-files-operations) 방법? 그들은 당신을 위해 모든 일을해야합니다. –

+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에 대해 확실하지 않음)에서 이상한 일을 할 수 있습니다. 파이썬 함수 seek()tell()은이 함수들에 비해 상대적으로 얇은 래퍼이기 때문에 이것도 마찬가지입니다.

Windows에서 파일 I/O를 수행 할 때 가장 좋은 방법은 모든 파일을 바이너리 모드로 열어 보는 것입니다. 따라서 open('somefile.txt', 'r') 대신 open('somefile.txt', 'rb')open('some_other_file.txt','w+b')을 입력하십시오.

바이너리 모드에서 파일을 열면 실제 단점은 없지만 이와 같은 이상한 점은 해결됩니다.

0

이 네 개의 라인이 재미있다 ...

  • print archivo2.read()
  • 라인 1에
  • archivo2.close()
  • , 당신은 파일에서 일부 데이터 펌프

    1. archivo2.write(archivo.read())
    2. archivo2.seek(0, 0); 그 과정에서 운영 체제는 프로세스를보다 효율적으로 수행 할 수 있도록 버퍼링을 수행합니다. 그 끝에 데이터의 일부가 디스크에 기록되었지만 버퍼의 일부가 버퍼에서 채워지기를 기다리고 있습니다.

      2 번 줄에서 파일의 앞부분에 파일의 위치를 ​​바꾸고 3 번 줄에 끝까지 을 읽습니다.실제로 버퍼가 디스크에 기록되도록하는 일은 결코하지 않았습니다.

      온라인에서는 파일을 닫지 만 버퍼가 무효화되었습니다.

      file.flush()으로 파일의 버퍼에있는 모든 내용을 디스크에 쓰길 원한다는 것을 파이썬에게 알릴 수 있습니다. 1,을 1과 2 사이에 추가하면 어떻게됩니까?