Писать и читать одновременно в Python? - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в Python. Я пытался сократить версию №1 (которая отлично работает) до более чистого кода, и я подумал, что могу просто втиснуть ее в однострочник. Почему не работает №2?

Я получаю, что объект «NoneType» не имеет атрибута «seek», когда я пытаюсь его запустить.

from sys import argv

script, filename = argv
  
# 1
open_file = open(filename, 'w+')
open_file.write("Hello world!")
open_file.seek(0)
print open_file.read()

# 2
open_file = open(filename, 'w+').write("Hello world!").seek(0).read()

print open_file

Я пробовал множество способами, но я все еще не могу заставить его работать.

Большое спасибо!

Ответы [ 5 ]

1 голос
/ 09 июля 2020

Из документации :

write (b) :

  • Записать данный байтовый объект b в базовый необработанный поток и возвращает количество записанных байтов

Таким образом, он возвращает количество записанных байтов, а не файловый объект, поэтому вы не можете связать другой вызов после write(). Обратите внимание, что вы также не можете связать seek(), поскольку это возвращает смещение в файл.

0 голосов
/ 09 июля 2020

Для записи

with open(filename, 'w+') as f: f.write("Hello world!")

и для печати содержимого

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

у меня работает! Ошибка Nonetype возникает из-за отсутствия типа возвращаемого значения, как указано другими.

0 голосов
/ 09 июля 2020

Вы получаете NoneType, потому что функция file.write не возвращает None. Или в этом случае int (сколько байтов записано в файл)

0 голосов
/ 09 июля 2020

Причина, по которой однострочный файл не работает, заключается в том, что .write() не возвращает обратно исходный дескриптор файла. Вместо этого write() возвращает количество записанных символов / байтов (в зависимости от режима открытого файла).

К сожалению, я не думаю, что есть способ сделать то, что вы хотите, в одном go , это не принесет в жертву читабельности. Что вы могли бы сделать, так это обернуть свой код в функцию или написать свой собственный файловый объект, который будет немедленно искать после записи.

0 голосов
/ 09 июля 2020

Вы должны закрыть файл, прежде чем открывать его снова. open_file.close()

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