Файлы. Работа с файлами.
В данной статье мы рассмотрим встроенные средства python для работы с файлами: открытие / закрытие, чтение и запись.
Итак, начнем. Прежде, чем работать с файлом, его надо открыть. С этим замечательно справится встроенная функция open:
У функции open много параметров, они указаны в статье "Встроенные функции", нам пока важны 3 аргумента: первый, это имя файла. Путь к файлу может быть относительным или абсолютным. Второй аргумент, это режим, в котором мы будем открывать файл.
Режим | Обозначение |
‘r’ | открытие на чтение (является значением по умолчанию). |
‘w’ | открытие на запись, содержимое файла удаляется, если файла не существует, создается новый. |
‘x’ | открытие на запись, если файла не существует, иначе исключение. |
‘a’ | открытие на дозапись, информация добавляется в конец файла. |
‘b’ | открытие в двоичном режиме. |
‘t’ | открытие в текстовом режиме (является значением по умолчанию). |
‘+’ | открытие на чтение и запись |
Режимы могут быть объединены, то есть, к примеру, ‘rb’ — чтение в двоичном режиме. По умолчанию режим равен ‘rt’.
И последний аргумент, encoding, нужен только в текстовом режиме чтения файла. Этот аргумент задает кодировку.
Чтение из файла
Открыли мы файл, а теперь мы хотим прочитать из него информацию. Для этого есть несколько способов, но большого интереса заслуживают лишь два из них.
Первый — метод read, читающий весь файл целиком, если был вызван без аргументов, и n символов, если был вызван с аргументом (целым числом n).
Ещё один способ сделать это — прочитать файл построчно, воспользовавшись циклом for:
Запись в файл
Теперь рассмотрим запись в файл. Попробуем записать в файл вот такой вот список:
Откроем файл на запись:
Запись в файл осуществляется с помощью метода write:
После окончания работы с файлом его обязательно нужно закрыть с помощью метода close:
Теперь попробуем воссоздать этот список из получившегося файла. Откроем файл на чтение (надеюсь, вы поняли, как это сделать?), и прочитаем строки.
Мы получили тот же список, что и был. В более сложных случаях (словарях, вложенных кортежей и т. д.) алгоритм записи придумать сложнее. Но это и не нужно. В python уже давно придумали средства, такие как pickle или json, позволяющие сохранять в файле сложные структуры.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Как вставить текст в python
Для добавления текста применяется метод insert() :
insert(index, chars)
Первый параметр представляет позицию вставки в формате "line.column" - сначала идет номер строки, а затем номер символа. Второй параметр - собственно вставляемый текст. Например, вставка в начало:
editor.insert("1.0", "Hello")
Для вставки в конец для позиции передается значение END :
from tkinter import * root = Tk() root.title("METANIT.COM") root.geometry("250x200") editor = Text() editor.pack(fill=BOTH, expand=1) editor.insert("1.0", "Hello World") # вставка в начало editor.insert(END, "\nBye World") # вставка в конец root.mainloop()
Получение текста
Для получения введенного текста применяется метод get() :
get(start, end)
Параметр start указывает на начальный символ, а end - на конечный символ, текст между которыми надо получить. Оба параметра в формате "line.colunm", где line - номер строки, а "column" - номер символа. Для указания последнего символа применяется константа END:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("300x200") editor = Text(height=5) editor.pack(anchor=N, fill=X) label=ttk.Label() label.pack(anchor=N, fill=BOTH) def get_text(): label["text"] = editor.get("1.0", "end") button = ttk.Button(text="Click", command=get_text) button.pack(side=BOTTOM) root.mainloop()
В данном случае по нажатию на кнопку срабатывает функция get_text() , которая получает текст и передается его для отображения в метку label:
Удаление текста
Для удаления текста применяется метод delete()
delete(start, end)
Параметр start указывает на начальный символ, а end - на конечный символ, текст между которыми надо удалить. Оба параметра в формате "line.colunm", где line - номер строки, а "column" - номер символа. Для указания последнего символа применяется константа END. Например, определим кнопку, которая будет удалять весь текст из виджета:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("300x200") editor = Text(height=10) editor.pack(anchor=N, fill=BOTH) def delete_text(): editor.delete("1.0", END) button = ttk.Button(text="Clear", command=delete_text) button.pack(side=BOTTOM) root.mainloop()
Замена текста
Для замены текста применяется метод replace() :
replace(start, end, chars)
Параметр start указывает на начальный символ, а end - на конечный символ, текст между которыми надо заменить. Оба параметра в формате "line.colunm", где line - номер строки, а "column" - номер символа. Для указания последнего символа применяется константа END. Последний параметр - chars - строка, на которую надо заменить. Например, замена первых четырех символов на строку "дама":
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("300x200") editor = Text(height=10) editor.pack(anchor=N, fill=BOTH) editor.insert("1.0", "мама мыла раму") def edit_text(): editor.replace("1.0", "1.4", "дама") button = ttk.Button(text="Replace", command=edit_text) button.pack(side=BOTTOM) root.mainloop()
Повтор и отмена операций
Методы edit_undo() и edit_redo() позволяют соответственно отменить и повторить операцию (добавление, изменение, удаление текста). Данные методы применяются, если в виджете Text параметр undo равен True. Стоит отметить, что данные методы оперируют своим стеком операций, в котором сохраняются данные операций. Однако если стек для соответствующего метода пуст, то вызов метода вызывает исключение. Простейший пример, где по нажатию на кнопку вызывается отмена или возврат операции:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") root.grid_columnconfigure(0, weight = 1) root.grid_columnconfigure(1, weight = 1) root.grid_rowconfigure(0, weight = 1) editor = Text(undo=True) editor.grid(column = 0, columnspan=2, row = 0, sticky = NSEW) def undo(): editor.edit_undo() def redo(): editor.edit_redo() redo_button = ttk.Button(text="Undo", command=undo) redo_button.grid(column=0, row=1) clear_button = ttk.Button(text="Redo", command=redo) clear_button.grid(column=1, row=1) root.mainloop()
Выделение текста
Для управления выделением текста виджет Text обладает следующими методами:
- selection_get() : возвращает выделенный фрагмент
- selection_clear() : снимает выделение
Применим данные методы:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def get_selection(): label["text"]=editor.selection_get() def clear_selection(): editor.selection_clear() editor = Text(height=5) editor.pack(fill=X) label = ttk.Label() label.pack(anchor=NW) get_button = ttk.Button(text="Get selection", command=get_selection) get_button.pack(side=LEFT) clear_button = ttk.Button(text="Clear", command=clear_selection) clear_button.pack(side=RIGHT) root.mainloop()
В данном случае по нажатию на кнопку get_button срабатывает функция get_selection, которая передает в метку label выделенный текст. При нажатии на кнопку clear_button срабатывает функция clear_selection, которая снимает выделение.
События
Достаточно часто встречает необходимость обработки ввода текста. Для виджета Text определено событие > , которое срабатывает при изменении текста в текстовом поле. Однако оно срабатывает один раз. И в этом случае мы можем обработать стандартные события клавиатуры. Например, событие освобождения клавиши :
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def on_modified(event): label["text"]=editor.get("1.0", END) editor = Text(height=8) editor.pack(fill=X) editor.bind("", on_modified) label = ttk.Label() label.pack(anchor=NW) root.mainloop()
В данном случае при освобождении клавиши будет срабатывать функция on_modified , в которой метке label передается весь введенный текст:
Другую распространенную задачу представляет динамическое получение выделенного текста. В этом случае мы можем обработать событие > . Например, при выделении текста выведем выделенный фрагмент в метку Label:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def on_modified(event): label["text"]=editor.selection_get() editor = Text(height=8) editor.pack(fill=X) editor.bind(">", on_modified) label = ttk.Label() label.pack(anchor=NW) root.mainloop()
Как через Python вставить текст?
Можно ли Python вставлять текст или нет? Просто нужно вставить текст в блокнот, но почитав оказалось что пайтон не может вставлять текст. Это так?
- Вопрос задан 27 нояб. 2023
- 158 просмотров
1 комментарий
Простой 1 комментарий
StreamThread @StreamThread
Можно открыть txt файл стандартной функцией open и добавлять текстовые строки в конец файла:
#Открываем файл по указанному пути как txt_stream. 'r' в начале означает что строка интерпретируется как raw: спец символы такие как табуляция - /t и новая строка - /n игнорируются, и можно быть уверенным что путь к файлу будет прочитан верно. #'wa' вторым аргументом означает режим открытия файла: w - запись текста, a - добавление новых данных от англ append. with open(r'D://New Folder/TextFile.txt', 'wa') as txt_stream: # Записываем в конец файла одну строку. Спец символ /n прибавляется к тексту чтобы следующий текст начинался с новой строки. txt_stream.write('Одиночная строка.' + '/n'). # Подготавливаем список со строками, которые следует записать в файл. strings_list = [ 'Первая строка/n', 'Вторая строка/n', 'Третья строка/n' ] # Записываем строки в файл. txt_stream.writelines(strings_list)
Решения вопроса 1
Денис @DenisShahbazyan
Вот так можно вставить текст в окно блокнота.
Используется только одна внешняя библиотека "pip install pypiwin32" - для ее установки. (После установки перезапусти IDE)
import time import ctypes import win32con from ctypes import wintypes as w KEYEVENTF_SCANCODE = 0x8 KEYEVENTF_UNICODE = 0x4 KEYEVENTF_KEYUP = 0x2 SPACE = 0x39 INPUT_KEYBOARD = 1 # not defined by wintypes ULONG_PTR = ctypes.c_ulong if ctypes.sizeof( ctypes.c_void_p) == 4 else ctypes.c_ulonglong class KEYBDINPUT(ctypes.Structure): _fields_ = [('wVk', w.WORD), ('wScan', w.WORD), ('dwFlags', w.DWORD), ('time', w.DWORD), ('dwExtraInfo', ULONG_PTR)] class MOUSEINPUT(ctypes.Structure): _fields_ = [('dx', w.LONG), ('dy', w.LONG), ('mouseData', w.DWORD), ('dwFlags', w.DWORD), ('time', w.DWORD), ('dwExtraInfo', ULONG_PTR)] class HARDWAREINPUT(ctypes.Structure): _fields_ = [('uMsg', w.DWORD), ('wParamL', w.WORD), ('wParamH', w.WORD)] class DUMMYUNIONNAME(ctypes.Union): _fields_ = [('mi', MOUSEINPUT), ('ki', KEYBDINPUT), ('hi', HARDWAREINPUT)] class INPUT(ctypes.Structure): _anonymous_ = ['u'] _fields_ = [('type', w.DWORD), ('u', DUMMYUNIONNAME)] lib = ctypes.WinDLL('user32') lib.SendInput.argtypes = w.UINT, ctypes.POINTER(INPUT), ctypes.c_int lib.SendInput.restype = w.UINT def send_scancode(code): i = INPUT() i.type = INPUT_KEYBOARD i.ki = KEYBDINPUT(0, code, KEYEVENTF_SCANCODE, 0, 0) lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT)) i.ki.dwFlags |= KEYEVENTF_KEYUP lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT)) def send_unicode(s): i = INPUT() i.type = INPUT_KEYBOARD for c in s: i.ki = KEYBDINPUT(0, ord(c), KEYEVENTF_UNICODE, 0, 0) lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT)) i.ki.dwFlags |= KEYEVENTF_KEYUP lib.SendInput(1, ctypes.byref(i), ctypes.sizeof(INPUT)) def find_notepad_window(notepad_title): while True: notepad_handle = ctypes.windll.user32.FindWindowW(None, notepad_title) if notepad_handle != 0: return notepad_handle time.sleep(1) def insert_text_into_notepad(notepad_handle, text): # Развернуть окно, если оно свернуто ctypes.windll.user32.ShowWindow(notepad_handle, win32con.SW_RESTORE) # Сделать окно активным ctypes.windll.user32.SetForegroundWindow(notepad_handle) # Изменить заголовок окна # ctypes.windll.user32.SendMessageW(notepad_handle, win32con.WM_SETTEXT, 0, text) # send_scancode(SPACE) # Текст в блокнот send_unicode(text) if __name__ == "__main__": notepad_title = "Безымянный – Блокнот" text_to_insert = "Привет, мир!" notepad_handle = find_notepad_window(notepad_title) insert_text_into_notepad(notepad_handle, text_to_insert)
Чтобы найти все окна в системе (все имена окон) запусти это
import ctypes def enum_windows_callback(hwnd, lParam): window_title = ctypes.create_unicode_buffer(1024) ctypes.windll.user32.GetWindowTextW(hwnd, window_title, 1024) print(f"Window Handle: , Window Title: ") return True ctypes.windll.user32.EnumWindows(ctypes.WINFUNCTYPE( ctypes.c_bool, ctypes.c_ulong, ctypes.c_ulong)(enum_windows_callback), 0)
Как вставлять текст в консоль из буфера обмена?
При нажатии привычного для windows ctrl+v вставляется соответствующий символ, еще попробовал различные ctrl+alt+v, ctrl+insert, insert не помогло подскажите пожалуйста как происходит вставка содержимого из буфера?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как получить текст из буфера обмена?
Пишу макрос (Word), вот фрагмент кода: Selection.Copy Windows('EMA').Activate.
Как взять текст из буфера обмена?
Как сделать так, чтоб при нажатии на тестовое поле (<INPUT name=text>) его содержимое изменилось.
Как получить текст из буфера обмена
вот код как получить Clipboard.GetText(); чет оно не юзает внешние данные не из программы. as is.
Как получить текст из буфера обмена?
Господа и Дамы программисты, кто подскажет как средствами С# получить текст из буфера обмена? А еще.
Регистрация: 06.05.2013
Сообщений: 242
В консоли удобно опробовать какую-то функуию не известную и вообще, используется только на первых парах для знакомства с языком. Вы не можете ввести коротенькую команду?
Если же вы пишите программу то её пишут или в IDE или обычном текстовом редакторе.
Кстати почему вам просто не использовать тупо IDLE которая идет в стандартом пакете при установке в windows? Там ctrl-v работает.
Регистрация: 04.11.2013
Сообщений: 117
Правой кнопкой мыши? (если в свойствах консоли стоит быстрая вставка)
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
А какая консоль-то? Если линуксовая, Ctrl + Shift + V, а ещё проще - щёлкнуть кнопкой, чтобы вставить выделенный раньше кусок текста. Если виндовая, зачем вам вообще это угробище?
Регистрация: 21.09.2010
Сообщений: 87
shift+insert
127 / 126 / 59
Регистрация: 22.01.2014
Сообщений: 460
gnome-terminal у себя я на insert клавишу настроил. В Windows cmd надо использовать системное меню( клик по заголовку окна правой кнопкой мышки). Кажется вопрос не по Питону.
С IDLE я работал раньше. Сейчас использую geany - очень удобный редактор кода, я им очень доволен.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как вставить текст из буфера обмена в DBMemo
копирую текст с Memo и нужно его же вставить в DBMemo , но туда обычным DBMemo1.PasteFromClipboard;.
Как в ставить из буфера обмена текст в сторонние приложение?
Всем привет! Вопрос такой . Понятное дело, создал Форм1 в котором размещается текстбокс1 в.
Как в PHP получить текст из буфера обмена сервера?
На локальной машине нужно получить текст из буфера обмена. Вот допустим на сайте Х скопировал.
Как вставить текст из буфера обмена в текстовый файл?
Подскажите пожалуйста как вставить текст из буфера обмена в текстовый файл который находится к.
VBA Word как записать в переменную текст из буфера обмена?
Добрый день! Как сделать так, что бы в iLink записывалось содержимое буфера обмена? (макрос.
Free Pascal IDE, как вставить текст из буфера обмена?
Помогите. Скопировал код в интернете. Как его вставить в IDE Free Pascal? Он не вставляется не как.
Или воспользуйтесь поиском по форуму: