Операции с файлами на Python

Я получил ошибку «IOError: [Errno 0] Error» с этой программой python:

from sys import argv file = open("test.txt", "a+") print file.tell() # not at the EOF place, why? print file.read() # 1 file.write("Some stuff will be written to this file.") # 2 # there r some errs when both 1 & 2 print file.tell() file.close() 

В чем проблема? Эти два случая ниже:

 from sys import argv file = open("test.txt", "a+") print file.tell() # not at the EOF place, why? # print file.read() # 1 file.write("Some stuff will be written to this file.") # 2 # there r some errs when both 1 & 2 print file.tell() file.close() 

а также:

 from sys import argv file = open("test.txt", "a+") print file.tell() # not at the EOF place, why? print file.read() # 1 # file.write("Some stuff will be written to this file.") # 2 # there r some errs when both 1 & 2 print file.tell() file.close() 

все же, почему

 print file.tell() # not at the EOF place, why? 

не печатает размер файла, это «+» в режиме добавления? то указатель файла должен указывать на EOF?

Я использую Windows 7 и Python 2.7.

  • Обслуживание больших файлов (с большими нагрузками) в Django
  • Вставка pyodbc.Binary data (BLOB) в столбец изображений SQL Server
  • python: создать блок «с» для нескольких менеджеров контекста
  • Virtualenv возвращает ошибку «Нет такого файла или каталога ...»
  • Удаление кэша pip?
  • pypi см. старые версии пакета
  • Pythonic разница между двумя датами в годах?
  • Отображать ссылки на новые созданные веб-страницы
  • 2 Solutions collect form web for “Операции с файлами на Python”

    Python использует функцию fopen stdio и передает режим в качестве аргумента. Я предполагаю, что вы используете окна, поскольку @Lev говорит, что код отлично работает в Linux.

    Ниже приведена документация по окнам Windows, это может быть ключом к решению вашей проблемы:

    Когда указывается тип доступа «r +», «w +» или «a +», допускаются чтение и запись (файл считается открытым для «обновления»). Однако при переключении между чтением и записью должна быть промежуточная операция fflush, fsetpos, fseek или rewind. Текущая позиция может быть указана для операции fsetpos или fseek, если это необходимо.

    Таким образом, решение должно добавить file.seek() перед file.write() . Чтобы добавить конец файла, используйте file.seek(0, 2) .

    Для вашей справки file.seek работает следующим образом:

    Чтобы изменить положение файлового объекта, используйте f.seek (offset, from_what). Позиция вычисляется добавлением смещения к точке отсчета; контрольная точка выбирается аргументом from_what. A from_what значение 0 измеряет от начала файла, 1 использует текущую позицию файла, а 2 использует конец файла в качестве контрольной точки. from_what можно опустить и по умолчанию 0, используя начало файла в качестве контрольной точки.

    [ссылка: http://docs.python.org/tutorial/inputoutput.html%5D

    Как упоминалось @lvc в комментариях и @Burkhan в его ответе, вы можете использовать новую функцию open из модуля io . Тем не менее, я хочу отметить, что функция записи не работает точно так же в этом случае – вам нужно указать строки unicode в качестве входных данных [просто префикс a u для строки в вашем случае]:

     from io import open fil = open('text.txt', 'a+') fil.write('abc') # This fails fil.write(u'abc') # This works 

    Наконец, пожалуйста, избегайте использования имени «файл» в качестве имени переменной, поскольку оно относится к встроенному типу и будет ненадолго переписанным, что приведет к некоторым трудным для обнаружения ошибкам.

    Решение состоит в том, чтобы использовать open from io

     D:\>python Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> f = open('file.txt','a+') >>> f.tell() 0L >>> f.close() >>> from io import open >>> f = open('file.txt','a+') >>> f.tell() 22L 
    Python - лучший язык программирования в мире.