我一直在尝试将一个长文本从一个文件复制到另一个文件,但它总是复制我一小部分文件。它看起来像我可以解决的极限问题。
如果有人能帮助我或解释哪个是我的错误,我会很高兴。
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()
答案 0 :(得分:2)
使用shutil.copy()
http://docs.python.org/library/shutil.html#shutil.copy
shutil.copy(src,dst)
将文件src复制到文件或目录dst。如果dst是目录,则在指定的目录中创建(或覆盖)与src具有相同基本名称的文件。权限位被复制。 src和dst是以字符串形式给出的路径名。
-Sunjay03
答案 1 :(得分:0)
您的文件是否有机会二进制而不是文本?它可以解释为什么只复制文件的一部分。无论如何,我建议使用已经提到的方法进行复制。
答案 2 :(得分: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')
。
以二进制模式打开文件没有真正的缺点,但解决了这样的怪异。
答案 3 :(得分:0)
这四行很有意思......
archivo2.write(archivo.read())
archivo2.seek(0, 0)
print archivo2.read()
archivo2.close()
在第1行,您将一些数据输出到文件中;在此过程中,操作系统有助于进行一些缓冲,以提高流程效率。最后,一些数据已写入磁盘,但其中一些数据仍在缓冲区中等待缓冲区填满。
在第2行,您将文件重新定位在文件的前面,在第3行,您读取直到文件末尾。你实际上从未做过任何会导致缓冲区被写入磁盘的事情。
在第4行,您关闭文件,但缓冲区无效。
你可以告诉python你希望文件缓冲区中的所有内容都写入磁盘,file.flush()
。在第1行和第2行之间添加archivo2.flush()
会发生什么?
答案 4 :(得分:-1)
也许你必须调用读/写函数(archivo2.write(archivo.read()) )经常不止一次。 尝试将其置于循环中并将文件数据复制到“Eof”(文件末尾)。 使用循环,如下所示:
while not Eof(archivo) do
...