Создать не программно текстовый файл со следующим содержимым one 1
До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в языке C реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.
В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:
С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения ("r"), записи ("w") или добавления ("a") и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:
Примечание. В случае использования относительной адресации текущим/рабочим каталогом в момент исполнения программы должен быть тот, относительно которого указанный относительный адрес корректен. Место нахождения самого исполняемого файла не важно.
При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile).
Если в силу тех или иных причин (нет файла по указанному адресу, запрещен доступ к нему) функция fopen() не может открыть файл, то она возвращает NULL. В реальных программах почти всегда обрабатывают ошибку открытия файла в ветке if , мы же далее опустим это.
Объявление функции fopen() содержится в заголовочном файле stdio.h, поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE.
После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам. Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции fclose() . В качестве параметра ей передается указатель на файл:
В программе может быть открыт не один файл. В таком случае каждый файл должен быть связан со своим файловым указателем. Однако если программа сначала работает с одним файлом, потом закрывает его, то указатель можно использовать для открытия второго файла.
Закрытие файла
После того как работа с файлом закончена, важно не забывать его закрыть, чтобы освободить место в памяти. Делается это с помощью файлового метода close() . Свойство файлового объекта closed позволяет проверить закрыт ли файл.
Если файл открывается в заголовке цикла ( for i in open('fname') ), то видимо интерпретатор его закрывает при завершении работы цикла или через какое-то время.
Чтение из текстового файла и запись в него
getc() или fgetc()
Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.
Приведенный в качестве примера код выводит данные из файла на экран.
Чтение из двоичного файла и запись в него
С файлом можно работать не как с последовательностью символов, а как с последовательностью байтов. В принципе, с нетекстовыми файлами работать по-другому не возможно. Однако так можно читать и писать и в текстовые файлы. Преимущество такого способа доступа к файлу заключается в скорости чтения-записи: за одно обращение можно считать/записать существенный блок информации.
При открытии файла для двоичного доступа, вторым параметром функции fopen() является строка "rb" или "wb".
Тема о работе с двоичными файлами достаточно сложная, для ее изучения требуется отдельный урок. Здесь будут отмечены только особенности функций чтения-записи в файл, который рассматривается как поток байтов.
Функции fread() и fwrite() принимают в качестве параметров:
- адрес области памяти, куда данные записываются или откуда считываются,
- размер одного данного какого-либо типа,
- количество считываемых данных указанного размера,
- файловый указатель.
Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно "заказать" считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.
Пример использования функций fread() и fwrite() :
Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.
Python предоставляет встроенные функции для создания, записи и чтения файлов. Существует два типа файлов, которые могут быть обработаны в Python, обычные текстовые файлы и двоичные (бинарные) файлы (записанные на двоичном языке, 0 и 1).
text files (от англ. текстовые файлы): в этом типе файлов каждая строка текста заканчивается специальным символом EOL (конец строки), которая по умолчанию является символом новой строки '\n' в python.
binary files (от англ. двоичные файлы): в этом типе файла нет разделителя для строки, и данные сохраняются после преобразования его в понятный машинный двоичный язык.
Сосредоточимся на открытии, закрытии, чтении и записи данных в текстовом файле.
Access Mode - Режимы доступа определяют тип возможных операций в открытом файле. Это относится к тому, как файл будет использоваться после его открытия. Эти режимы также определяют местоположение дескриптора файла в файле. Дескриптор файла похож на курсор, который определяет, откуда данные должны быть прочитаны или записаны в файл. В питоне есть 6 режимов доступа:
Read Only 'r' (от англ. только чтение): открывает текстовый файл для чтения. Дескриптор располагается в начале файла. Если файл не существует, возникает ошибка ввода-вывода. Это также режим по умолчанию, в котором файл открывается.
Read and Write 'r+' (от англ. чтение и запись): открывает файл для чтения и записи. Дескриптор располагается в начале файла. Вызывает ошибку ввода-вывода, если файл не существует.
Write Only 'w' (от англ. только запись): открывает файл для записи. Для существующего файла данные усекаются и перезаписываются. Дескриптор располагается в начале файла. Создает файл, если файл не существует.
Write and Read 'w+' (от англ. запись и чтение): открывает файл для чтения и записи. Для существующего файла данные усекаются и перезаписываются. Дескриптор располагается в начале файла.
Append Only 'a' (от англ. только добавить): открывает файл для записи. Файл создается, если он не существует. Дескриптор располагается в конце файла. Записываемые данные будут вставлены в конце, после существующих данных.
Append and Read 'a+' (от англ. добавить и прочитать): открывает файл для чтения и записи. Файл создается, если он не существует. Дескриптор располагается в конце файла. Записываемые данные будут вставлены в конце, после существующих данных.
Открытие файла делается с помощью встроенной функции open() . Для этой функции не требуется импортировать модуль.
функции open() передают один или два аргумента. Первый – имя файла или имя с адресом, если файл находится не в том каталоге, где находится скрипт. Второй аргумент – режим, в котором открывается файл.
Файл должен существовать в том же каталоге, что и программный файл python, в противном случае полный адрес файла должен быть записан на месте имени файла.
r ставится перед именем файла, чтобы символы в строке имени файла не обрабатывались как специальные символы. Например, если в адресе файла есть \temp , то \t обрабатывается как символ табуляции и возникает ошибка неверного адреса. R делает строку необработанной, то есть сообщает, что строка не имеет специальных символов. Символ r можно игнорировать, если файл находится в том же каталоге и адрес не размещается.
Если файл отсутствует, то открытие его в режиме w создаст новый файл. Бывают ситуации, когда надо гарантировано создать новый файл, избежав случайной перезаписи данных существующего. В этом случае вместо режима w используется режим x . В нем всегда создается новый файл для записи. Если указано имя существующего файла, то будет выброшено исключение. Потери данных в уже имеющемся файле не произойдет.
Если при вызове open() второй аргумент не указан, то файл открывается в режиме чтения как текстовый файл. Чтобы открыть файл как байтовый, дополнительно к букве режима чтения/записи добавляется символ b . Буква t обозначает текстовый файл. Поскольку это тип файла по умолчанию, то обычно ее не указывают.
Нельзя указывать только имя файла без его типа, то есть open('имя_файла', 'b') есть ошибка, даже если файл открывается на чтение. Правильно – open('имя_файла.тип_файла', 'rb') . Только текстовые файлы мы можем открыть командой open('имя_файла') , потому что и r и t подразумеваются по-умолчанию.
Функция open() возвращает объект файлового типа. Его надо либо сразу связать с переменной, чтобы не потерять, либо сразу прочитать.
С помощью файлового метода read() можно прочитать файл целиком или только определенное количество байт. Создайте в блокноте файл data.txt с таким содержимым:
Откроем его и почитаем:
Сначала считываются первые десять байтов, которые равны десяти символам. Это не бинарный файл, но мы все равно можем читать по байтам. Последующий вызов read() считывает весь оставшийся текст. После этого объект файлового типа file_read становится пустым.
Заметим, что метод read() возвращает строку, и что конец строки считывается как \n .
Для того, чтобы читать файл построчно существует метод readline() :
Метод .readlines() считывает сразу все строки и создает список:
Объект файлового типа относится к так называемым итерируемым объектам. Из таких объектов происходит последовательное извлечение элементов. Поэтому считывать данные из них можно сразу в цикле без использования методов чтения:
Здесь при выводе наблюдаются лишние пустые строки. Функция print() преобразует \n в переход на новую строку. К этому добавляет свой переход на новую строку. Создадим список строк файла без \n :
Переменной line присваивается очередная строка файла. Метод line.strip() очищает стоку от лишних пробелов справа или с лева от стоки и удаляет \n .
Создайте файл numbers.txt , содержащий несколько чисел, записанных через пробел:
Напишите программу, которая подсчитывает и выводит на экран общую сумму чисел, хранящихся в этом файле. Алгоритм должен быть универсальным. Числа могут быть различной длины, разделяться несколькими пробелами и записанными в несколько строк.
Проверьте работу написанного алгоритма на новом файле new_numbers.txt:
Проверьте корректность работы алгоритма. Общая сумма равна: 1233
Создайте файл goods.txt , в котором хранится список покупок:
Напишите программу, которая подсчитывает и выводит на экран общую сумму чисел, хранящихся в этом файле. Добавьте в файл записи покупок:
Проверьте корректность работы алгоритма. Общая сумма равна: 48240.98
Напишите программу с вопросами, с использованием генерации интерфейса. Алгоритм должен быть универсальным.
Пример файла questions.txt:
Проверьте корректность работы генератора интерфейса, на примере измененного файла questions.txt:
Доработайте предыдущий вариант программы:
Запись в файл выполняется с помощью методов .write() и .writelines() . Во второй можно передать структуру данных:
Метод .write() возвращает количество записанных символов. \n - символ переноса строки, считается за один символ.
В результате выполнения кода в появиться файл new_data.txt с текстом в нем
После того как работа с файлом закончена, важно не забывать его закрыть, чтобы освободить место в памяти. Делается это с помощью файлового метода close() . Свойство файлового объекта closed позволяет проверить закрыт ли файл:
Если файл открывается в заголовке цикла for line in open("file_name") , то видимо интерпретатор его закрывает при завершении работы цикла.
В Python имеется инструмент, применяя который может упростить чтение и редактирование файлов. Оператор with создает диспетчер контекста, который автоматически закрывает файл для вас, по окончанию работы в нем. Посмотрим, как это работает:
Синтаксис для оператора with . as . не сложен. Фактически, все, что мы делаем в данном примере, это:
Далее можно выполнять все стандартные операции ввода\вывода, в привычном порядке, пока находитесь в пределах блока. После того, как вы покинете блок кода, файловый дескриптор закроет его, и его уже нельзя будет использовать. Т.е. более нет необходимости закрывать файл, так как оператор делает это автоматически.
Напишите программу создающую файл week_days.txt со следующим содержимым:
Создайте файл data.txt со следующим содержимым:
Напишите программу, которая открывает этот файл на чтение, построчно считывает из него данные и записывает строки в другой файл data_ru.txt , заменяя английские числительные русскими, которые содержатся в списке: ['один', 'два', 'три', 'четыре', 'пять'] , определенном до открытия файлов.
Напишите программу, которая сохраняет данные из Listbox() в текстовый файл.
Напишите программу, загружающую содержимое текстового файла в виджет Listbox() .
Напишите программу, которая загружает данные из файла в Listbox() . Позволяет добавить и удалить данные и сохраняет изменения в файл.
Напишите программу для составления списка вопросов. Левая сторона программы содержит:
Даны два файлы со словами, разделенными пробелами. Создать новый файл, содержащий: а) строки, которые встречаются только в первом файле; б) строки, которые встречаются в обоих файлах; в) строки, которые встречаются в каждом файле более двух раз.
Создать новый текстовый файл, содержащий список ip без повторений из исходного файла
Дан текстовый файл со статистикой посещения сайта за неделю. Имеется 10 строк(10 посещений).
Создать символьный файл, содержащий все символы, встретившиеся в тексте (без повторений)
Дан текстовый файл. Создать символьный файл, содержащий все символы, встретившиеся в тексте.
Создать из программы файл целых случайных чисел. Затем создать новый файл, содержащий только числа кратные трем
Создать из программы файл целых случайных чисел. Затем создать новый файл, содержащий только числа.
ksen___23, что именно не получается? Какой конкретно вопрос? Как файл открыть? Как считывать с файла.
За Вас полностью программу никто писать не будет. Могу подсказать алгоритм, например.
алгоритм боле менее ясен, непонятно как реализовать синтаксически
Добавлено через 1 минуту
и не понятно как открыть файл. считывать с файла , там вроде бы нужно указывать полный путь к нему .
ksen___23, Работа с файлами , почитайте, тут описано, как открыть файл, считать и закрыть. Да и вообще аналог вашей программы почти.
сам код каким образом будет выглядеть для данных условий? а) строки, которые встречаются только в первом файле; б) строки, которые встречаются в обоих файлах; в) строки, которые встречаются в каждом файле более двух раз.
ksen___23, сам код это не вариант, так как вы ничего не поймете. Вы считываете все строки из первого файла в массив, потом из второго. Проверяете на совпадение и записываете во второй файл. Вы написали, что вам понятно, как считывать файл, поэтому вопросов не должно возникнуть.
Для начала считайте строки файлов в массивы и приложите ваш код.
Ну в том-то и дело, что теоретически понятно, но с реализацией конкретные проблемы, даже после обращения к интернет ресурсам
ksen___23, Пусть у нас есть два файла. Скиньте код, который их откроет и считает строки из них в массивы.
Аналогично сделаем для второго файла. И откроем еще третий файл на запись.
Осталось запустить цикл на проверку одинаковых элементов в массивах, в успешном случае записать это строку в третий файл с помощью:
'\n' мы используем для переноса строки.
Добавлено через 50 секунд
Еще вопросы остались?
Fury67, у меня! Я конечно не эксперт, но мне кажется конструкция with open() - приятнее, но опять же на вкус и цвет, как говорится
Я вот задание перечитал, а тут оказывается строки, а не слова
Добавлено через 36 секунд
Или всё же слова?))
Добавлено через 4 минуты
Наверное как-то так:
Добавлено через 42 секунды
Нагляднее я придумать просто не могу. Тут просто циклы и условия, всё должно быть понятно.
Кому как. Мне приятнее самому закрывать файл, для меня это нагляднее чем использовать схему его автоматического закрытия.
Добавлено через 3 минуты
Удобнее текст создать и записать в файл с помощью питона. Что бы все было в одном месте, и создание файла и работа с ним.
Пишете текст, сохраняете в файле, закрываете файл (для чистоты эксперимента). Затем открываете файл, читаете его, и обрабатываете содержимое, закрываете файл.
Добавлено через 20 минут
В конце кода можно не закрывать файл, так как он закрывается автоматически при завершении программы.
Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в обратном порядке
Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в.
Файл: Создать новый файл, содержащий числа исходного файла в обратном порядке.
пожалуйста, помогите задача: дан файл целых чисел, создать новый файл содержащий те же файлы, но в.
Всем привет, задание такое: Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию. Скопировать из файла F1 в файл F2 строки, начиная с К до К+5.
Будьте так любезны, помогите написать ибо я вообще не понимаю как это сделать.
Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию
Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию. Скопировать в.
Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию
Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию 1) Скопировать в.
Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию
Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию 1)скопировать в.
Создать текстовый файл и записать в него N строк длины N
Создать текстовый файл и записать в него N строк длины N;строка с номером K должна содержать K.
Благодарю, но как написать такой код на С, а не на плюсах?
Добавлено через 1 минуту
John Locke Благодарю, но не могли бы вы подсказать, как написать данную программу не на плюсах, а на C?
Создать текстовый файл и записать в него 5 одинаковых строк
Помогите создать текстовый файл и записать в него 5 одинаковых строк. Записываемая строка вводится.
Создать текстовый файл с указанным именем и записать в него N строк
Дано имя файла и целое число (0<N<27). Создать текстовый файл с указанным именем и записать в него.
Создать текстовый файл с указанным именем и записать в него N строк
Ребят если можно напишите как нибудь программу по проще) не усложняите, а то не поверят что я её.
Создать текстовый файл с указанным именем и записать в него N строк
Дано имя файла и целые положительные числа N и K. Создать текстовый файл с указанным именем и.
Большие объемы данных хранят не в списках или словарях, а в файлах и базах данных. В этом уроке изучим особенности работы с текстовыми файлами в Python. Такие файлы рассматриваются как содержащие символы и строки.
Бывают еще байтовые (бинарные) файлы, которые рассматриваются как потоки байтов. Побайтово считываются, например, файлы изображений. Работа с бинарными файлами несколько сложнее. Нередко их обрабатывают с помощью специальных модулей Python (pickle, struct).
fscanf()
Функция fscanf() аналогична по смыслу функции scanf() , но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных:
Возвращает количество удачно считанных данных или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.
Допустим, у нас есть файл содержащий такое описание объектов:
Тогда, чтобы считать эти данные, мы можем написать такую программу:
В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.
Практическая работа
Создайте файл data.txt по образцу урока. Напишите программу, которая открывает этот файл на чтение, построчно считывает из него данные и записывает строки в другой файл ( dataRu.txt ), заменяя английские числительные русскими, которые содержатся в списке ( ["один", "два", "три", "четыре", "пять"] ), определенном до открытия файлов.
Создайте файл nums.txt , содержащий несколько чисел, записанных через пробел. Напишите программу, которая подсчитывает и выводит на экран общую сумму чисел, хранящихся в этом файле.
Примеры решения и дополнительные уроки в android-приложении и pdf-версии курса
Запись в файл
Запись в файл выполняется с помощью методов write() и writelines() . Во второй можно передать структуру данных:
Метод write() возвращает количество записанных символов.
Функция open
Связь с файлом на жестком диске выполняется с помощью встроенной в Python функции open() . Обычно ей передают один или два аргумента. Первый – имя файла или имя с адресом, если файл находится не в том каталоге, где находится сама программа. Второй аргумент – режим, в котором открывается файл.
Обычно используются режимы чтения ( 'r' ) и записи ( 'w' ). Если файл открыт в режиме чтения, то запись в него невозможна. Можно только считывать данные. Если файл открыт в режиме записи, то в него можно только записывать данные, считывать нельзя.
Если файл открывается в режиме 'w' , то все данные, которые в нем были до этого, стираются. Файл становится пустым. Если не надо удалять существующие в файле данные, тогда следует использовать вместо режима записи, режим дозаписи ( 'a' ).
Если файл отсутствует, то открытие его в режиме 'w' создаст новый файл. Бывают ситуации, когда надо гарантировано создать новый файл, избежав случайной перезаписи данных существующего. В этом случае вместо режима 'w' используется режим 'x' . В нем всегда создается новый файл для записи. Если указано имя существующего файла, то будет выброшено исключение. Потери данных в уже имеющемся файле не произойдет.
Если при вызове open() второй аргумент не указан, то файл открывается в режиме чтения как текстовый файл. Чтобы открыть файл как байтовый, дополнительно к букве режима чтения/записи добавляется символ 'b' . Буква 't' обозначает текстовый файл. Поскольку это тип файла по умолчанию, то обычно ее не указывают.
Нельзя указывать только тип файла, то есть open("имя_файла", 'b') есть ошибка, даже если файл открывается на чтение. Правильно – open("имя_файла", 'rb') . Только текстовые файлы мы можем открыть командой open("имя_файла") , потому что и 'r' и 't' подразумеваются по-умолчанию.
Функция open() возвращает объект файлового типа. Его надо либо сразу связать с переменной, чтобы не потерять, либо сразу прочитать.
Чтение файла
С помощью файлового метода read() можно прочитать файл целиком или только определенное количество байт. Пусть у нас имеется файл data.txt с таким содержимым:
Откроем его и почитаем:
Сначала считываются первые десять символов. Последующий вызов read() считывает весь оставшийся текст. После этого объект файлового типа f1 становится пустым.
Заметим, что метод read() возвращает строку, и что конец строки считывается как '\n' .
Для того, чтобы читать файл построчно существует метод readline() :
Метод readlines() считывает сразу все строки и создает список:
Объект файлового типа относится к итераторам. Из таких объектов происходит последовательное извлечение элементов. Элементами в данном случае являются строки-линии файла. Поэтому считывать данные из них можно сразу в цикле без использования методов чтения:
Здесь выводятся лишние пустые строки, потому что функция print() преобразует '\n' в переход на новую строку. К этому добавляет свой переход на новую строку. Создадим список строк файла без '\n' :
Переменной i присваивается очередная строка файла. Мы берем ее срез от начала до последнего символа, не включая его. Следует иметь в виду, что '\n' это один символ, а не два.
fgets()
Функция fgets() аналогична функции gets() и осуществляет построчный ввод из файла. Один вызов fgets() позволят прочитать одну строку. При этом можно прочитать не всю строку, а лишь ее часть от начала. Параметры fgets() выглядят таким образом:
Такой вызов функции прочитает из файла, связанного с указателем myfile, одну строку текста полностью, если ее длина меньше 50 символов с учетом символа '\n', который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ '\0', добавленный fgets() . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет '\0'. В таком случае '\n' в считанной строке содержаться не будет.
В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr. Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.
Запись в текстовый файл
Также как и ввод, вывод в файл может быть различным.
- Форматированный вывод. Функция fprintf ( файловый_указатель, строка_формата, переменные ) .
- Посточный вывод. Функция fputs ( строка, файловый_указатель ) .
- Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .
Ниже приводятся примеры кода, в которых используются три способа вывода данных в файл.
Запись в каждую строку файла полей одной структуры:
Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки '\n'):
Пример посимвольного вывода:
Читайте также: