Nano Hash - криптовалюты, майнинг, программирование

Операции с файлами 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()

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

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.

24.06.2012

  • Где вы получаете ошибку? Проблема в том, что вы пытаетесь прочитать файл, открытый в режиме добавления 24.06.2012
  • Кроме того, вы уверены, что text.txt существует? 24.06.2012
  • Ваш код отлично работает для меня. tell возвращает 0 сразу после открытия файла, конечно, зачем ожидать чего-то другого? 24.06.2012
  • Можете ли вы добавить версию Python, которую вы используете, и операционную систему? 24.06.2012
  • Смотрите мой обновленный ответ, это исправление должно работать. Я попробовал это на той же версии платформы + Python, что и вы. 24.06.2012

Ответы:


1

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

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

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

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

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

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

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

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

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

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

24.06.2012
  • @LevLevitsky, я не мог убедиться в этом из документации, но вы правы, код работает 24.06.2012
  • Более того, несуществующие файлы он тоже открывает без ошибок. 24.06.2012
  • Да, но это не работает, когда в файле есть текст. 24.06.2012
  • Это не так, по крайней мере, в моей системе. 24.06.2012
  • Я использую Windows, Python 2.7, а вы? 24.06.2012
  • @Dhara, конечно, файл test.txt существует. 24.06.2012
  • Если это разница в платформе, самое простое решение: from io import open. Здесь используется новый open из Py3, который ведет себя одинаково везде, где запускается. 24.06.2012
  • @user1477871 user1477871 да, from io import open работает в Py2.7 — он заменяет встроенную функцию open более новой (теперь она используется по умолчанию). 24.06.2012
  • Больше данных! При запуске из консоли под vscode я получаю эту досадную ошибку. Если вместо этого я запускаю из cmder (он же cmder.net), он работает нормально. Просто для полноты картины также работает ванильный cmd.exe. Так что может быть что-то о том, как vscode обрабатывает... ввод-вывод? 01.05.2018

  • 2

    Решение состоит в том, чтобы использовать open из 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
    
    24.06.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..