Проблема чтения / записи файлов - PullRequest
2 голосов
/ 23 августа 2011

Я пытался скопировать длинный текст из одного файла в другой, но он всегда копировал мне только небольшую его часть. Это похоже на проблему предела, которую я могу решить.

Буду рад, если кто-нибудь сможет мне помочь или объяснить, в чём заключается моя ошибка.

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

Ответы [ 5 ]

2 голосов
/ 24 августа 2011

Использовать shutil.copy()

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

shutil.copy (src, dst)

Скопировать файл src в файл или каталог dst.Если dst является каталогом, в указанном каталоге создается (или перезаписывается) файл с тем же базовым именем, что и src.Биты разрешения копируются.src и dst - это имена путей, заданные в виде строк.

-Sunjay03

0 голосов
/ 24 августа 2011

Эти четыре строки интересны ...

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

В строке 1 вы выкачиваете некоторые данные в файл; по пути операционная система услужливо выполняет некоторую буферизацию, чтобы сделать процесс более эффективным. В конце этого некоторые данные были записаны на диск, но некоторые все еще остаются в буфере, ожидая его заполнения.

В строке 2 вы перемещаете файл в начало файла, а в строке 3 вы читаете до конца файла . На самом деле вы никогда не делали ничего, что приводило бы к записи буфера на диск.

В строке 4 вы закрываете файл, но буфер был признан недействительным.

Вы можете сказать python, что хотите, чтобы все содержимое буфера файла записывалось на диск, с помощью file.flush(). Что происходит, когда вы добавляете archivo2.flush() между строками 1 и 2?

0 голосов
/ 24 августа 2011

Windows (по крайней мере, до XP включительно, не уверен в Vista и 7) может делать странные вещи, когда вы используете fseek() или ftell() для файла, открытого в текстовом режиме.Поскольку функции Python seek() и tell() являются лишь относительно тонкими оболочками вокруг этих функций, это относится и к ним.

Я считаю, что при выполнении операций ввода-вывода файлов в Windows лучше всего просто открыть все файлы в двоичном режиме.Таким образом, вместо open('somefile.txt', 'r') вы бы сделали open('somefile.txt', 'rb') и open('some_other_file.txt','w+b').

Открытие файлов в двоичном режиме не имеет реальных недостатков, но решает такие странности вот так.

0 голосов
/ 24 августа 2011

Является ли ваш файл случайно двоичным, а не текстовым? Это может объяснить, почему копируется только часть файла. В любом случае, я предлагаю использовать метод, уже упомянутый для копирования.

0 голосов
/ 23 августа 2011

Возможно, вам нужно вызвать функцию чтения / записи (archivo2.write (archivo.read ()) ) чаще, чем один раз. Попробуйте получить его в цикле и копировать данные файла до «Eof» (конец файла). Используйте цикл, что-то вроде этого:

while not Eof(archivo) do
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...