Python 3, методы open (), read () и write ()

from sys import argv

script, filename = argv

print ("We're going to erase %r" % filename)
print ("If you don't want to do that, press CTRL-C (^C)")
print ("If you do want that, hit RETURN.")

input("?")

print ("Opening the file...")
target = open(filename, 'r+')

print ("Truncating the file. Goodbye!")
target.truncate()

print ("Enter two lines: ")
line1 = input("Line 1: ")
line2 = input("Line 2: ")

print ("I'm going to write those to the file")

target.write(line1)
target.write('\n')
target.write(line2)

print (target.read()) 

print ("Closing file")
target.close()

Когда я запускаю скрипт, компилятор действует так, как будто нет строки print (target.read ()). Если я закрываю цель перед этой строкой и создаю новую переменную, например, скажем txt = open (filename, 'r +'), а затем print (txt.read ()), она работает. Может кто-нибудь объяснить, почему это не работает, как я делал это выше?

Не было бы проще открыть файл как with open(filename, 'w') as target:, который стирает все данные, записывает две входные строки, затем with open(filename, 'r') as target: и читает?

tgikal 11.10.2018 19:24

Сначала сделал это, но потом я менял код, чтобы понять, почему эта строка не работает.

Aleksandar 11.10.2018 19:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
338
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Думайте о работе с файлами как о двух указателях: один - это переменная для самого файла, а второй - как указатель на то место в файле, где вы в данный момент находитесь.

Вы сначала target.truncate файл, чтобы очистить содержимое, указатель находится на первом символе в файле.

Затем вы даете 3 команды target.write, указатель на которые переместится в конец каждой строки, когда эта команда будет завершена.

Наконец, вы пробуете target.read. В этот момент курсор находится в конце файла, и читать дальше нечего. Если вы хотите прочитать содержимое файла, вам нужно будет либо закрыть и снова открыть файл, либо выполнить target.seek(0), чтобы переместить указатель на начало файла на 0-й байт, прежде чем вы фактически выполните target.read.

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

Aleksandar 11.10.2018 19:29

В идеале вы должны разделять операции логически. Вы можете использовать оператор with для самозакрытия файла после завершения логической операции.

Sunny Patel 11.10.2018 19:31

Когда вы что-то пишете и читаете в файле, вы меняете указатель файла. В этом случае вы читаете последнюю позицию в файле.

Вы можете добавить эту строку перед read (), чтобы изменить указатель на первую позицию в файле.

target.seek(0)

Похоже, у меня это работает.

from sys import argv

script, filename = argv

print ("We're going to erase %r" % filename)
print ("If you don't want to do that, press CTRL-C (^C)")
print ("If you do want that, hit RETURN.")

input("?")

print ("Opening the file...")
with open(filename, 'w') as target:
  print ("Enter two lines: ")
  line1 = input("Line 1: ")
  line2 = input("Line 2: ")
  print ("I'm going to write those to the file")
  target.write(line1)
  target.write('\n')
  target.write(line2)

with open(filename, 'r') as target:
  print (target.read())

input ("Closing file")

Другие вопросы по теме