Python 读/写文件问题

Python 读/写文件问题,python,file,Python,File,我一直试图将一个长文本从一个文件复制到另一个文件,但它总是只复制了其中的一小部分。这看起来像是一个极限问题,我可以解决 如果有人能帮助我或解释我的错误,我会很高兴 def runMenu(): print "\nMENU" print " 1) Copiar" print " 0) Exit" response = int( raw_input().strip() ) if response == 1: print "Copiar" try:

我一直试图将一个长文本从一个文件复制到另一个文件,但它总是只复制了其中的一小部分。这看起来像是一个极限问题,我可以解决

如果有人能帮助我或解释我的错误,我会很高兴

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()

也许您必须调用读/写函数(archivo2.write(archivo.read()) )不止一次。 尝试将其放入循环中并复制文件数据,直到“Eof”(文件结束)。 使用循环,类似这样:

while not Eof(archivo) do
...
使用
shutil.copy()

shutil.副本(src、dst)

将文件src复制到文件或目录dst。如果dst是一个目录,则在指定的目录中创建(或覆盖)一个与src具有相同基名的文件。权限位被复制。src和dst是以字符串形式给出的路径名


-Sunjay03

您的文件是二进制文件而不是文本吗?它可以解释为什么只复制文件的一部分。在任何情况下,我建议使用前面提到的方法进行复制。

当您在以文本模式打开的文件上使用
fseek()
ftell()
时,Windows(至少在XP之前,包括XP,不确定Vista和7)可能会做一些奇怪的事情。由于Python函数
seek()
tell()
只是围绕这些函数相对较薄的包装,这也适用于它们

我发现在Windows中进行文件I/O时,最好的方法是以二进制模式打开所有文件。因此,您将执行
open('somefile.txt','r')
,而不是
open('somefile.txt','rb')
open('someother_file.txt','w+b')


在二进制模式下打开文件并没有真正的缺点,但解决了这种奇怪的问题。

这四行很有趣

  • archivo2.write(archivo.read())
  • archivo2.seek(0,0)
  • print archivo2.read()
  • archivo2.close()
  • 在第1行,您将一些数据输出到文件中;在此过程中,操作系统会进行一些缓冲,以提高流程的效率。最后,部分数据已写入磁盘,但仍有部分数据滞留在缓冲区中,等待缓冲区填满

    在第2行,您将文件重新定位在文件前面,在第3行,您将一直读取到文件末尾。实际上,您从未做过任何会导致缓冲区写入磁盘的操作

    在第4行,您关闭了文件,但缓冲区无效


    通过
    file.flush()
    ,您可以告诉python您希望将文件缓冲区中的所有内容写入磁盘。在第1行和第2行之间添加
    archivo2.flush()
    时会发生什么情况?

    确定吗?在中,它说“如果大小参数为负数或省略,请读取所有数据,直到达到EOF。”-虽然我自己没有测试过,所以您可能完全正确,在这种情况下,请忽略我的注释:)尽管这不是对您问题的直接回答,如果您只想将文件复制到新位置而不修改任何内容,你看过方法吗?他们应该为你做所有的工作。你从中复制的文件的大小这绝对是“真实”代码的方式,但从OP的程序来看,他似乎在尝试示例代码。