Перейти к содержимому

Как передать файл в функцию python

  • автор:

Как сделать вызов функции из другого файла в python?

Чтобы сделать вызов функции из другого файла в python, ее необходимо сначала импортировать. Вы можете импортировать как весь файл(модуль), так и отдельно функции из него. Для импорта, каталог, в котором лежит файл, должен быть пакетом(package), то есть содержать в себе файл init.py .

Импорт модуля. В таком случае функции из модуля вызываются через точку:

from my_package import my_module # где my_package - пакет # my_module - искомый файл def main(): x = my_module.function() . 

Импорт конкретной функции из модуля:

from my_package.my_module import function def main(): x = function() . 

Потоки. Передача файлов. Клиент-серверный чат¶

Потоки (thread) в Python позволяет одновременно запускать разные подпрограммы, таким образом становится возможно выполнять несколько подпрограмм в одно и то же время. thread — это отдельный поток выполнения.

На самом деле подпрограммы даже при использовании потоков не выполняются одновременно:

  1. Работа с потоками — это не работа с разными ядрами процесса, мы фактически работаем внутри того же процесса, что и без потоков, только дробим его на подзадачи, так что о более эффективном распределении ресурсов речи не идёт.
  2. В Python для обеспечения стабильности и снижения конфликтов работает специальный шлюз — Global Interpreter Lock (GIL). Он и контролирует потоки.

GIL переключает потоки по умолчанию раз в 5 миллисекунд, так что потоки работают не одновременно, а последовательно, постоянно сменяя друга.

Самая близкая идея работе потоков в Питоне — сеанс одновременной игры в шахматы, когда один шахматист играет с несколькими. Сеанс хоть и называется “одновременным”, но фактически шахматист обходит всех по очереди и делает свой ход в каждой партии.

Для работы с потоками используются модули _thread и threading (более новый).

Рассмотрим простой код для работы с потоками.:

import threading import time def thread_function(number): print(f"Thread number>: starting\n") time.sleep(2) print(f"Thread number>: finishing\n") threads = list() for index in range(3): print(f"Create and start thread index>\n") x = threading.Thread(target=thread_function, args=(index,)) threads.append(x) x.start() for i,thread in enumerate (threads): print (f'Join thread i> \n') thread.join() 

Передача файлов¶

  1. Настраиваем сокет, устанавливаем соединение.
  2. На отправляющей стороне:
    • открываем файл на чтение в режиме байтового чтения ( ‘rb’ ).
    • построчно передаём файл принимающей стороне.
  3. На принимающей стороне:
    • открываем файл на запись в режиме байтовой записи ( ‘wb’ ).
    • построчно пишем в файл всё, что получаем от передающей стороны.
  4. Закрываем файлы и соединение.

Передача файлов байтовыми строками позволяет пересылать любые файлы, независимо от их типа, расширения и т.п.

Пример кода для отправки файла с клиента серверу.

import socket import sys # создаём сокет и связываем его с IP-адресом и портом sock = socket.socket() ip = "localhost" port = 9999 sock.bind((ip, port)) # сервер ожидает передачи информации sock.listen(10) while True: # начинаем принимать соединения conn, addr = sock.accept() # выводим информацию о подключении print('connected:', addr) # получаем название файла name_f = (conn.recv(1024)).decode ('UTF-8') # открываем файл в режиме байтовой записи в отдельной папке 'sent' f = open('sent/' + name_f,'wb') while True: # получаем байтовые строки l = conn.recv(1024) # пишем байтовые строки в файл на сервере f.write(l) if not l: break f.close() conn.close() print('File received') sock.close() 
import socket import sys ip = "localhost" port = 9999 # создаём сокет для подключения sock = socket.socket() sock.connect((ip,port)) # запрашиваем имя файла и отправляем серверу f_name = input ('File to send: ') sock.send((bytes(f_name, encoding = 'UTF-8'))) # открываем файл в режиме байтового чтения f = open (f_name, "rb") # читаем строку l = f.read(1024) while (l): # отправляем строку на сервер sock.send(l) l = f.read(1024) f.close() sock.close() 

Задания¶

  1. Используя код из урока, реализуйте возможность отправлять файл с сервера клиенту.
  2. Реализуйте возможность передачи файлов как от клиента серверу, так и от сервера клиенту:
  • должна быть возможность выбрать режим передачи (1 — от клиента серверу, 2 — от сервера клиенту);
  • оформите код с помощью функций;
  • добавьте графический интерфейс с помощью модуля easygui.
  1. Используя потоки напишите клиент-серверный чат, который будет принимать и отправлять сообщения. Для этого потребуется оформить код в функции.

© Copyright Revision 07b34d26 .

Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latest

Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Загрузка файлов на сервер модулем requests в Python

Для понимания этого материала необходимо ознакомиться с передачей дополнительных параметров в запросе методом POST, который представлен в ознакомительной статье к библиотеке requests .

  • Отправка одного файла на сервер.
  • Отправка нескольких файлов на сервер.

Отправка одного файла на сервер.

Библиотека requests упрощает загрузку файлов на сервер с многосоставной кодировкой Multipart-encoded . Для этого, в словарь с дополнительными параметрами POST запроса необходимо добавить ключ ‘file’ , а в качестве его значения указать объект открытого файла с помощью функции open() в двоичном режиме ‘rb’ :

Сразу смотрим пример:

>>> import requests # целевой URL-адрес >>> url = 'https://httpbin.org/post' # открываем файл на чтение в # бинарном режиме ('rb') >>> fp = open('report.xls', 'rb') # помещаем объект файла в словарь # в качестве значения с ключом 'file' >>> files = 'file': fp> # передаем созданный словарь аргументу `files` >>> resp = requests.post(url, files=files) >>> fp.close() >>> resp.text # # . # "files": # "file": "" # >, # . # > 

Можно явно указать имя файла, content_type и другие заголовки в значении ключа file создаваемого словаря, для передачи файла на сервер:

>>> import requests >>> url = 'https://httpbin.org/post' >>> fp = open('report.xls', 'rb') # указываем дополнительные заголовки и параметры >>> files = 'file': ('report.xls', fp, 'application/vnd.ms-excel', 'Expires': '0'>)> >>> resp = requests.post(url, files=files) >>> fp.close() >>> resp.text # # . # "files": # "file": "" # >, # . # > 

При желании, вместо самого файла можно отправить строку, представляющую контент файла:

>>> import requests >>> url = 'https://httpbin.org/post' >>> files = 'file': ('report.csv', 'some, data, to, send\nanother, row, to, send\n')> >>> resp = requests.post(url, files=files) >>> resp.text # # . # "files": # "file": "some,data,to,send\\nanother,row,to,send\\n" # >, # . # > 

Отправка нескольких файлов на сервер.

Постоянно возникают ситуации, когда необходимо отправить несколько файлов на сервер в одном запросе. Например, предположим, что надо загрузить файлы изображений в HTML-форму с несколькими полями из файлов изображений .png :

input type="file" name="images" multiple="true" required="true"/> 

Для этого просто передаем файловые объекты (предварительно открытые функцией open() в двоичном режиме ‘rb’ ) в список кортежей следующего вида (form_field_name, file_info) :

>>> import requests # целевой адрес с формой отправки >>> url = 'https://httpbin.org/post' # добавляем файловые объекты в список кортежей >>> multiple_files = [ . ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')), . ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))] # делаем запрос >>> resp = requests.post(url, files=multiple_files) >>> resp.text  . 'files': 'images': 'data:image/png;base64,iVBORw . '> 'Content-Type': 'multipart/form-data; boundary=31316. ', . > 

Предупреждение. Настоятельно рекомендуется открывать файлы в двоичном режиме ‘rb’ . Это связано с тем, что запросы могут попытаться предоставить заголовок Content-Length , и если это произойдет, то это значение будет установлено на количество байтов в файле. При открытии файла в текстовом режиме могут возникнуть ошибки.

  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • GET и POST запросы c модулем requests
  • Получение/отправка заголовков сервера модулем requests
  • Извлечение и установка cookies с модулем requests
  • Сессии/сеансы Session() модуля requests
  • Объект ответа сервера Response модуля requests
  • Получение и отправка данных в виде JSON с модулем requests
  • Установка timeout для модуля requests
  • Объект PreparedRequest модуля requests
  • Загрузка файлов на сервер модулем requests
  • Загрузка больших данных модулем requests
  • HTTP-прокси или SOCKS-прокси с модулем requests
  • Использование хуков модуля requests
  • Аутентификация с модулем requests
  • SSL и модуль requests

Передача имени файла как параметра в программу на Python

У меня есть код программы на Python, программу я запускаю через терминал и входные данные у меня находятся в файле input.txt, как мне в качестве аргумента передать название файла и чтобы это заработало?

Отслеживать
48.6k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 17 мар 2020 в 12:02
1,273 3 3 золотых знака 12 12 серебряных знаков 33 33 бронзовых знака

Например python3 main.py input.txt , тогда из sys.argv вытаскиваете путь к файлу input.txt , открываете его и работаете

17 мар 2020 в 12:07
Если же через input() хотите считывать, тогда: python3 main.py < input.txt 17 мар 2020 в 12:13

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

При таком запуске
python script.py input.txt или таком
script.py input.txt

import sys try: file_name = sys.argv[1] # получаем 1й элемент списка (в примерах выше именно он отвечает за имя файла) except IndexError: file_name = 'input.txt' # если нам не передают имя файла, то "выбираем" его сами 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *