Создайте файл и напишите ему, используя скрипт python? Без использования функции open ()? [закрыто]

Возможно ли сделать это без использования модуля os или функции open()?

Как я могу создать файл и записать его с указанными выше условиями с помощью Python?

Также вы могли бы объяснить, как работает скрипт?

1
задан 23 November 2015 в 16:05

5 ответов

Это своего рода язык в щеку, но вот способ создания и записи в файл с использованием python без open:

python -c 'print("Hello World")' > file
4
ответ дан 23 May 2018 в 15:34

Принимая это как вызов «бежать из песочницы». Вы хотите

открыть файл без импорта каких-либо модулей (я собираюсь предположить, что это также исключает использование __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'>
3
ответ дан 23 May 2018 в 15:34

Используйте модуль 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

]

См. https://docs.python.org/2/library/subprocess.html

1
ответ дан 23 May 2018 в 15:34
  • 1
    Я не могу отрицать, что это ответ на вопрос, но это странное кодирование. Я бы не рекомендовал использовать shell=True также ... Ненужный, и вы не знаете, как OP намеревается его использовать. docs.python.org/2/library/&hellip – Jacob Vlijm 23 November 2015 в 16:18
  • 2
    да, это угроза безопасности, но вопрос заключался в том, как сделать это нестандартным способом (подразумевается использование санитария пользователя :)) – Marek Bettman 23 November 2015 в 16:22

Хотя в вашем вопросе говорится, что вы хотите избежать 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.")

Вы должны понимать этот фрагмент самостоятельно после прочтения приведенных выше объяснений.

0
ответ дан 23 May 2018 в 15:34
  • 1
    Я видел, что подпроцесс используется так (для записи в файл, хотя с & gt; & gt;) только один раз, когда кто-то (возможно, не очень опытный в python), написанный для цикла в python, выполнял 2 команды оболочки с использованием модуля подпроцесса. Предполагалось, что переписать старые сценарии оболочки в python, вызвать скорость и +100 до уличного кредо ... Но, с другой стороны, по крайней мере эта часть действительно работала ... – Marek Bettman 23 November 2015 в 16:27
  • 2
    @MarekBettman >> в Bash означает добавить что-то в файл (a режим доступа в Python), в то время как > в Bash записывает что-то в файл, заменяя его, если он уже существует (w режим доступа в Python) , И прямое использование команд оболочки просто устраняет / уменьшает переносимость кода, что является одним из основных преимуществ Python, а также легко открывает дыры в безопасности. – Byte Commander 23 November 2015 в 16:31
  • 3
    Поверь мне, я знаю. Это то, что я пытался сказать - это был неоптимальный способ сделать это. И я полностью поддерживаю идею использования встроенных модулей. Но можно сделать это немного вокруг :) – Marek Bettman 23 November 2015 в 16:34
  • 4
    Конечно, это возможно. Вы также можете написать расширение C для доступа к файлу и загрузить его на Python, и, возможно, даже пусть C-код выполнит какой-либо ассемблер и вызовет необработанные функции ядра. Это всегда возможно, трудно, но никто не стал бы это делать. – Byte Commander 23 November 2015 в 16:37
  • 5
    Работая с кодом на разных языках от разных разработчиков, я прекратил использовать «никто действительно не рассмотрит, что делать», предложения некоторое время назад :) – Marek Bettman 23 November 2015 в 16:39

Игнорируя ваше предложение не использовать 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>

Если каталог содержит пробелы, используйте кавычки. Объяснение содержится в комментариях к сценарию (!).

0
ответ дан 23 May 2018 в 15:34
  • 1
    Примечание: для создания нового пустого файла, если он не существует, вы можете использовать флаг x. См. документы . – Bakuriu 23 November 2015 в 19:41
  • 2
    @ Бакуриу этого не знал. Он создает FileExistsError, если это так, что в большинстве случаев не очень удобно :). Спасибо, хотя для полезного добавления, – Jacob Vlijm 24 November 2015 в 00:32

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

Похожие вопросы: