Возможно ли сделать это без использования модуля os или функции open()?
Как я могу создать файл и записать его с указанными выше условиями с помощью Python?
Также вы могли бы объяснить, как работает скрипт?
Это своего рода язык в щеку, но вот способ создания и записи в файл с использованием python без open:
python -c 'print("Hello World")' > file
Принимая это как вызов «бежать из песочницы». Вы хотите
открыть файл без импорта каких-либо модулей (я собираюсь предположить, что это также исключает использование __import__). и без использования встроенной функции open. Я собираюсь предположить, что использование встроенной функции (Python 2-only) file также является обманом.Ну, разве это не интересно? (Python 3)
>>> [c for c in object.__subclasses__() if c.__module__ == '_io']
[<class '_io._BytesIOBuffer'>, <class '_io._IOBase'>,
<class '_io.IncrementalNewlineDecoder'>]
Давайте будем ходить по иерархии типов _io._IOBase:
>>> _iobase = _[1]
>>> _iobase.__subclasses__()
[<class '_io._RawIOBase'>, <class '_io._BufferedIOBase'>,
<class 'io.IOBase'>, <class '_io._TextIOBase'>]
>>> [x.__subclasses__() for x in iobase.__subclasses__()]
[[<class '_io.FileIO'>, <class 'io.RawIOBase'>],
[<class '_io.BytesIO'>, <class '_io.BufferedReader'>,
<class '_io.BufferedRandom'>, <class 'io.BufferedIOBase'>,
<class '_io.BufferedRWPair'>, <class '_io.BufferedWriter'>],
[<class 'io.RawIOBase'>, <class 'io.BufferedIOBase'> <class 'io.TextIOBase'>],
[<class '_io.StringIO'>, <class '_io.TextIOWrapper'>, <class 'io.TextIOBase'>]]
Bingo. _io.FileIO - это класс, который мы хотим: он имеет открытый конструктор с функциональностью подмножество open() (он может открывать только двоичные файлы, это достаточно хорошо для этого упражнения). Итак, вот полный побег:
def get_subclass(cls, name):
for c in cls.__subclasses__():
if c.__name__ == name: return c
return None
_iobase = get_subclass(object, '_IOBase')
_rawiobase = get_subclass(_iobase, '_RawIOBase')
fileio = get_subclass(_rawiobase, 'FileIO')
with fileio("/tmp/i_escaped", "w") as fp:
fp.write(b"booyah\n")
Если вам не разрешено использовать встроенный глобальный object (например, если __builtins__ был кастрирован), вы все равно можете попасть в класс [ f13]:
>>> {}.__class__.__base__
<class 'object'>
Используйте модуль subprocess - предполагается заменить os.system и аналогичные:
subprocess.call("echo test > ~/test.txt", shell=True)
Что вы делаете, как правило, запускаете новую оболочку, где вы выполняете echo test и перенаправляете вывод в файл [ f4]
Некоторое школьное задание или тест на вербовку? :)
Изменить: см. docs: https://docs.python.org/2/library/subprocess.html
Изменить: в python 3.5 это subprocess.run
]Хотя в вашем вопросе говорится, что вы хотите избежать open(...), я публикую это, потому что я не могу думать о какой-либо причине или ситуации, которая оправдывала бы использование других методов, чем встроенная функция open(...) и потому что я уже написал этот ответ для вашего последнего вопроса, который не утверждал, что вы еще не хотите использовать open(...), и который вы удалили, прежде чем я могу это представить. Не стесняйтесь игнорировать его или скажите, почему это не должно работать в вашем случае.
Самый простой и простой способ открыть файл - использовать блок with open:
with open("example.txt", "r") as f:
print(f.read())
Команда open(file_name, access_mode) открывает заданный file_name в желаемом access_mode. По умолчанию используется "r", но вы также можете "w" rite (удаляет / перезаписывает файл, если он уже существует! Создает его, если нет) или "a" ppend (пишите в конец файла, создавайте, если не существуете). Вы можете также открыть в двоичном режиме вместо текстового режима, добавив "b" в access_mode, или вы можете открыть для чтения и записи, добавив "+".
Конструкция with ... as f: начинается блок, в котором вы можете получить доступ к переменной f, которая будет удерживать вывод вызываемой функции (open(...) в нашем случае), поэтому объект файла. Конструкция with позаботится о правильном закрытии файла для вас, как только программа покинет этот блок. Без with вам придется закрыть файл вручную.
Метод read() файлового объекта считывает и возвращает полное содержимое файла. Если вы передадите целочисленный аргумент и назовите его как read(n), n будет максимальным количеством возвращаемых байтов. Вы также можете использовать readline() для чтения одной строки текстового файла или readlines(), чтобы получить все строки в виде списка строк.
Чтобы записать в файл, процедура почти такая же :
with open("example2.txt", "w") as f:
f.write("I am an example.")
Вы должны понимать этот фрагмент самостоятельно после прочтения приведенных выше объяснений.
Игнорируя ваше предложение не использовать open(), просто потому, что оно встроено под скриптом, который использует небольшое количество опций open() i.c.w. write()
#!/usr/bin/env python3
import sys
f = sys.argv[2]
# run the script with either one of the arguments: "create", "create", "replace" or "append_create"
arg = sys.argv[1]
# just create a file, or blank it if it already exists:
if arg == "create":
open(f, "wt")
# write to a file, replacing the current content (create if it doesn't exist)
elif arg == "replace":
open(f, "wt").write("oooops")
# append to a file
elif arg == "append":
open(f, "a").write("monkey eats banana")
# append to a file, create it if it doesn't exist
elif arg == "append_create":
open(f, "a+").write("monkey eats banana")
Сохраните его в пустой файл как testwrite.py Запустите его командой python3 /path/to/testwrite.py <arg> </path/to/file>
Если каталог содержит пробелы, используйте кавычки. Объяснение содержится в комментариях к сценарию (!).