Работа с текстовыми файлами python 3

Шаг 4 — Запись файла

На этом этапе мы запишем новый файл, который включает в себя название «Days of the Week», и дни недели. Сначала создадим переменную title.

files.py

title = 'Days of the Weekn'

Также нужно сохранить дни недели в строковой переменной days. Открываем файл в режиме чтения, считываем файл и сохраняем вывод в новую переменную days.

files.py

path = '/users/sammy/days.txt'
days_file = open(path,'r')
days = days_file.read()

Теперь, когда у нас есть переменные для названия и дней недели, запишем их в новый файл. Сначала нужно указать расположение файла. Мы будем использовать каталог /users/sammy/. Также нужно указать новый файл, который мы хотим создать. Фактический путь будет /users/sammy/new_days.txt. Мы записываем его в переменную new_path. Затем открываем новый файл в режиме записи, используя функцию open() с режимом w.

files.py

new_path = '/users/sammy/new_days.txt'
new_days = open(new_path,'w')

Если файл new_days.txt уже существовал до открытия, его содержимое будет удалено, поэтому будьте осторожны при использовании режима «w».

Когда новый файл будет открыт, поместим в него данные, используя <file>.write(). Операция write принимает один параметр, который должен быть строкой, и записывает эту строку в файл.

Если хотите записать новую строку в файл, нужно указать символ новой строки. Мы записываем в файл заголовок, за которым следуют дни недели.

iles.py

new_days.write(title)
print(title)

new_days.write(days)
print(days)

Всякий раз, когда мы заканчиваем работу с файлом, нужно его закрыть. Мы покажем это в заключительном шаге.

Что такое метод read() в Python?

Метод будет считывать все содержимое файла как одну строку. Это хороший метод, если в вашем текстовом файле мало содержимого .

В этом примере давайте используем метод для вывода на экран списка имен из файла demo.txt:

file = open("demo.txt")
print(file.read())

Запустим этот код и получим следующий вывод:

# Output:

# This is a list of names:
# Jessica
# James
# Nick
# Sara

Этот метод может принимать необязательный параметр, называемый размером. Вместо чтения всего файла будет прочитана только его часть.

Если мы изменим предыдущий пример, мы сможем вывести только первое слово, добавив число 4 в качестве аргумента для .

file = open("demo.txt")
print(file.read(4))

# Output:
# This

Если аргумент размера опущен или число отрицательное, то будет прочитан весь файл.

Позиции указателя файла

Python предоставляет метод tell(), который используется для печати номера байта, в котором в настоящее время существует указатель файла. Рассмотрим следующий пример.

# open the file file2.txt in read mode  
fileptr = open("file2.txt","r")  

#initially the filepointer is at 0   
print("The filepointer is at byte :",fileptr.tell())  
  
#reading the content of the file  
content = fileptr.read();  
  
#after the read operation file pointer modifies. tell() returns the location of the fileptr.   
  
print("After reading, the filepointer is at:",fileptr.tell())  

Выход:

The filepointer is at byte : 0
After reading, the filepointer is at: 117

Открытие файлов в Python

Python по умолчанию предоставляет нам функцию open(), которая предназначена для открытия файла. Рассмотрим пример использования данной функции.


file = open("text.txt") # Открытие файла

file = open("C:/text.txt") #Открытие файла по его пути

Существует несколько режимов открытия файла, r — для чтения, w — для записи, a — для добавления. По умолчанию Python использует режим чтение файла

Режим Описание
r Открывает файл для чтения. (по умолчанию)
w Открывает файл для записи. Создает новый файл, если он не существует, или усекает файл, если он существует.
x Открывает файл для эксклюзивного создания. Если файл уже существует, операция завершается неудачей.
a Открывает файл для добавления в конце файла без его усечения. Создает новый файл, если он не существует.
t Открывается в текстовом режиме. (по умолчанию)
b Открывается в двоичном режиме.
+ Открывает файл для обновления (чтения и записи)

Режим открытия указывается следующим образом:


f = open("text.txt") #Режим r по умолчанию

f = open("text.txt", "w")# Режим записи в файл

f = open("text.txt", "a") # Режим добавления

Кроме того, надо учитывать кодировку файла, по умолчанию кодировка зависит от вашей операционной системы. Для Windows, кодировка cp1251, а для Linux utf — 8. Соответственно, что бы наша программа вела себя одинаково на разных платформах, лучшим решением будет указание явной кодировки.


file = open("text.txt", "r", encoding = "utf-8" )

Режимы работы с документом

Вторым параметром в функцию open() передается режим работы с файлом. Охарактеризуем их (таблица 1).

Режим Характеристика
r Открыть для чтения
w Открыть для записи (если такого документа не существует, то он будет создан)
a Дописать новое содержимое в файл в дополнение к имеющемуся
x Открыть для записи в несуществующий файл
t Представить контент как текст
+ Открыть документ как для чтения, так и записи
b Представить контент в виде байтов

Таблица 1 – Режимы открытия файла

Если данный аргумент не передать, то файл по умолчанию будет отображаться в виде текста в режиме чтения. Кодировку указывать всегда обязательно, так как содержимое может предстать в виде нечитаемой «каши» символов.

Open a file with its own program

Python has a simple method for opening a file with its default program. It goes something like this:

import os
os.startfile(path)

Yes, it’s that easy, if you’re on Windows. If you’re on Unix or Mac, you’ll need the subprocess module or «os.system». Of course, if you’re a real geek, then you probably have multiple programs that you might want to use to open a specific file. For example, I might want to edit my JPEG file with Picasa, Paint Shop Pro, Lightroom, Paint.NET or a plethora of other programs, but I don’t want to change my default JPEG editing program. How do we solve this with Python? We use Python’s subprocess module! Note: If you want to go old school, you can also use os.popen* or os.system, but subprocess is supposed to supersede them.

import subprocess

import subprocess

pdf = "path/to/pdf"
acrobat_path = r'C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe'
subprocess.Popen(f"{acrobat_path} {pdf}")

You can also write the last line like this: subprocess.Popen(). Suffice it to say, using the subprocess module is also a breeze. There are many other ways to use the subprocess module, but this is one of its primary tasks. I usually use it to open a specific file (like above) or to open a program for me with specific arguments applied. I also use subprocess’s «call» method, which causes the Python script to wait for the «called» application to complete before continuing. You can also communicate with the processes that subprocess launches, if you have the know how.

Всё же, что такое Python?¶

Python — это вещь, называемая языком программирования. Она принимает текст (обычно называемый кодом), который ты написал, переводит его в инструкции для компьютера, которые затем исполняет. Мы будем учиться писать код, чтобы делать клёвые и полезные вещи. Отныне вы не обязаны использовать чужие программы, чтобы выполнять работу на компьютере!

В действительности, Python – всего лишь ещё одна программа на твоём компьютере. Для начала нужно узнать, как использовать и взаимодействовать с ним. Существует много способов научиться этому, первый из которых – работать и интерпретатором Python, используя консоль операционной системы (ОС).

Консоль (“терминал”, “командная строка”) – это текстовый (в отличие от так называемых “окружений рабочего стола” (Desktop Environment, DE), работающих в связке с мышью) интерфейс для работы с ОС.

Открываем консоль в Mac OS X

Стандартная консоль OS X зовётся Терминалом, который можно найти с помощью поиска (правый верхний угол) по системе или в разделе Приложения -> Утилиты .

Командная строка Terminal — это инструмент для “общения” с компьютером. Открывшееся окно должно содержать сообщение-подсказку, что-то вроде этого:

mycomputer:~ myusername$

Открываем консоль в GNU/Linux

В дистрибутивах GNU/Linux (Ubuntu, Fedora, Mint и т.д.) обычно уже установлены разные программы-консоли, обычно называемые терминалами. То, какой терминал установлен, зависит от используемого дистрибутива. Например, в Ubuntu это Gnome Terminal. После запуска появляется приглашение вроде этого:

myusername@mycomputer:~$

Запись файла

Чтобы записать текст в файл, нам нужно открыть файл с помощью метода open с одним из следующих режимов доступа.

  • w: он перезапишет файл, если какой-либо файл существует. Указатель файла находится в начале файла.
  • a: добавит существующий файл. Указатель файла находится в конце файла. Он создает новый файл, если файл не существует.

Пример 1.

# open the file.txt in append mode. Create a new file if no such file exists.
fileptr = open("file2.txt", "w")

# appending the content to the file
fileptr.write('''Python is the modern day language. It makes things so simple.
It is the fastest-growing programing language''')

# closing the opened the file
fileptr.close()

Выход:

File2.txt

Python is the modern-day language. It makes things so simple. It is the fastest growing programming language.

Скриншот файла file2.txt

Мы открыли файл в режиме w. Файл file1.txt не существует, он создал новый файл, и мы записали его содержимое с помощью функции write().

Пример 2.

#open the file.txt in write mode.  
fileptr = open("file2.txt","a")
  
#overwriting the content of the file  
fileptr.write(" Python has an easy syntax and user-friendly interaction.")  
    
#closing the opened file   
fileptr.close()

Выход:

Python is the modern day language. It makes things so simple.
It is the fastest growing programing language Python has an easy syntax and user-friendly interaction.

Снимок файла file2.txt

Мы видим, что содержимое файла изменено. Мы открыли файл в режиме и добавили содержимое в существующий файл file2.txt.

Чтобы прочитать файл с помощью сценария Python, Python предоставляет метод read(). Метод read() считывает строку из файла. Он может читать данные как в текстовом, так и в двоичном формате.

Синтаксис метода read() приведен ниже.

fileobj.read(<count>)      

Здесь счетчик – это количество байтов, которые должны быть прочитаны из файла, начиная с его начала. Если счетчик не указан, он может читать содержимое файла до конца.

Рассмотрим следующий пример.

#open the file.txt in read mode. causes error if no such file exists.  
fileptr = open("file2.txt","r")
#stores all the data of the file into the variable content  
content = fileptr.read(10) 
# prints the type of the data stored in the file  
print(type(content))    
#prints the content of the file  
print(content)     
#closes the opened file  
fileptr.close()  

Выход:

<класс 'str'>
 Python is

В приведенном выше коде мы прочитали содержимое file2.txt с помощью функции read(). Мы передали значение счетчика как десять, что означает, что он будет читать первые десять символов из файла.

Если мы используем следующую строку, она распечатает все содержимое файла.

content = fileptr.read()
print(content) 

Выход:

Python is the modern-day language. It makes things so simple.
It is the fastest-growing programing language Python has easy an syntax and user-friendly interaction

The need for “open with” statement

Before going into the “with statement” we need to understand the requirement behind it. For that, we first need to know how to open a file in python.

In python to read or write a file, we need first to open it and python provides a function open(), which returns a file object. Using this file object, we can read and write in the file. But in the end, we need to close the file using this same.

Check out this example,

# open a file
file_object = open('sample.txt')

# read the file content
data = file_object.read()

# print file content
print(data)

#close the file
file_object.close()
This is a sample file.
It contains some sample string.
you are going to use it.
Thanks.
FileNotFoundError:  No such file or directory: 'sample.txt'

In the above example, we opened a file sample.txt using open() function, which returned a file object. Then read file’s content as string using file object’s read() function. Then printed that and in the end closed this file using the same file object.

This will work fine in typical scenarios, but there can be problems in some situations like,

What if someone forgets to close the file in the end?

Well, it seems highly impossible now, but in big projects, people usually do big stuff after opening files, and it includes many conditions and checks. So, there can be scenarios when the return statement hit before close() function gets called, or it got skipped sue to some if condition in code.

Well, in scenarios like these, till we don’t call the close() function, the file will remain open, and its object will be consuming the memory of our process. Also, there might be chances that data will not entirely be flushed to the file. Closing a file using close() function is a graceful way of closing the file.

What if an exception comes?

Check out this code

# File is not closed in case of exception
try:
    # open a file
    file_object = open('sample.txt')
    # read file content
    data = file_object.read()
    # It will raise an exception
    x = 1 / 0
    print(data)
    file_object.close()
except:
    # Handling the exception
    print('An Error')
finally:
    if file_object.closed == False:
        print('File is not closed')
    else:
        print('File is closed')
An Error
File is not closed
# File is not closed in case of exception
try:
    # open a file
    file_object = open('sample.txt')
    # read file content
    data = file_object.read()
    # It will raise an exception
    x = 1 / 0
    print(data)
    file_object.close()
except:
    file_object.close()
    # Handling the exception
    print('An Error')
finally:
    if file_object.closed == False:
        print('File is not closed')
    else:
        print('File is closed')

How to Open a Text File

Let’s start by learning how to open a file with Python. In this case, what we mean is to actually use Python to open it and not some other program. For that, we have two choices (in Python 2.x): open or file. Let’s take a look and see how it’s done!

# the open keyword opens a file in read-only mode by default
f = open("path/to/file.txt")

# read all the lines in the file and return them in a list
lines = f.readlines()

f.close()

As you can see, it’s really quite easy to open and read a text file. You can replace the «open» keyword with the «file» keyword and it will work the same. If you want to be extra explicit, you can write the open command like this instead:

f = open("path/to/file.txt", mode="r")

The «r» means to just read the file. You can also open a file in «rb» (read binary), «w» (write), «a» (append), or «wb» (write binary). Note that if you use either «w» or «wb», Python will overwrite the file, if it exists already or create it if the file doesn’t exist.

If you want to read the file, you can use the following methods:

  • read — reads the whole file and returns the whole thing in a string
  • readline — reads the first line of the file and returns it as a string
  • readlines — reads the entire file and returns it as a list of strings

You can also read a file with a loop, like this:

f = open("path/to/file.txt")
for line in f:
    print line
f.close()

Pretty cool, huh? Python rocks! Now it’s time to take a look at how to open a file with another program.

Запись в файл Python

Чтобы записать данные в файл в Python, нужно открыть его в режиме ‘w’, ‘a’ или ‘x’. Но будьте осторожны с режимом ‘w’. Он перезаписывает файл, если то уже существует. Все данные в этом случае стираются.

Запись строки или последовательности байтов (для бинарных файлов) осуществляется методом write(). Он возвращает количество символов, записанных в файл.

with open("test.txt",'w',encoding = 'utf-8') as f:
   f.write("my first filen")
   f.write("This filenn")
   f.write("contains three linesn")

Эта программа создаст новый файл ‘test.txt’. Если он существует, данные файла будут перезаписаны. При этом нужно добавлять символы новой строки самостоятельно, чтобы разделять строки.

Методы работы с файлами

Методы Описание
close() Закрывает открытый файл.
detach()
fileno() Возвращает целое число (файловый дескриптор) файла.
flush() Сбрасывает буфер записи потока файлов.
isatty() ВОЗВРАТ True если файловый поток является интерактивным.
read(n) Читает самое большее n символы из файла. Читает до конца файла, если он отрицательный или None.
readable() ВОЗВРАТ True если файловый поток можно прочитать.
readline(n=-1) Считывает и возвращает одну строку из файла
readlines(n=-1) Считывает и возвращает список строк из файла
seek(offset,from=SEEK_SET)
seekable() ВОЗВРАТ True если файловый поток поддерживает произвольный доступ.
tell() Возвращает текущее местоположение файла.
truncate(size=None) Изменяет размер потока файлов следующим образом size байты. Если size не указан, изменяет размер до текущего местоположения.
writable() ВозвращаетTrue, если файловый поток может быть записан.
write(s) Записывает строку sв файл и возвращает количество записанных символов.
writelines(lines) Записывает список lines в файл.

Генератор случайных файлов

Создадим папку , а внутри нее еще одну — . Дерево каталогов теперь должно выглядеть вот так:

ManageFiles/
 |
 |_RandomFiles/

Чтобы поиграться с файлами, мы сгенерируем их случайным образом в директории . Создайте файл в папке . Вот что должно получиться:

ManageFiles/
 |
 |_ create_random_files.py
 |_RandomFiles/

Готово? Теперь поместите в файл следующий код, и перейдем к его рассмотрению:

import os
from pathlib import Path
import random

list_of_extensions = 

# перейти в папку RandomFiles
os.chdir('./RandomFiles')

for item in list_of_extensions:
    # создать 20 случайных файлов для каждого расширения имени
    for num in range(20):
        # пусть имя файла начинается со случайного числа от 1 до 50
        file_name = random.randint(1, 50)
        file_to_create = str(file_name) + item
        Path(file_to_create).touch()

Начиная с Python 3.4 мы получили pathlib, нашу маленькую волшебную палочку. Также мы импортируем функцию для генерации случайных чисел, но ее мы посмотрим в действии чуть ниже.

Сперва создадим
список файловых расширений для формирования названий файлов. Не стесняйтесь
добавить туда свои варианты.

Далее мы переходим в папку и запускаем цикл. В нем мы просто говорим: возьми каждый элемент и сделай с ним кое-что во внутреннем цикле 20 раз.

Теперь пришло время для импортированной функции . Используем ее для производства случайных чисел от 1 до 50. Это просто не очень творческий способ побыстрее дать названия нашим тестовым файлам: к сгенерированному числу добавим расширение файла и получим что-то вроде или . И так 20 раз для каждого расширения. В итоге образуется беспорядок, достаточный для того, чтобы его было лень сортировать вручную.

Итак, запустим
наш генератор хаоса через терминал.

python create_random_files.py

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

В той же директории, где , создадим файл и поместим туда следующий код.

Open multiple files in a single “with statement”

Let’s open two files using a single “with statement”. We will read from sample.txt and write in the outfile.txt,

# Read from sample.txt and write in outfile.txt
with open('outfile.txt', 'w') as file_obj_2, open('sample.txt', 'r') as file_obj_1:
    data = file_obj_1.read()
    file_obj_2.write(data)
    # Both the files will be closed automatically when execution block ends.

The complete example is as follows,

def main():

    print('*** Open a file using without "open with" statement ***')

    print('Normal way of opening & reading from a file using open() function')

    # open a file
    file_object = open('sample.txt')

    # read the file content
    data = file_object.read()
    print(data)

    #close the file
    file_object.close()

    print('** Open a file using open() function & handle exception **')

    # File is not closed in case of exception
    try:
        # open a file
        file_object = open('sample.txt')
        # read file content
        data = file_object.read()
        # It will raise an exception
        x = 1 / 0
        print(data)
        file_object.close()
    except:
        # Handling the exception
        print('An Error')
    finally:
        if file_object.closed == False:
            print('File is not closed')
        else:
            print('File is closed')

    print('**** Open a file using "open with" statement ****')

    # using "with statement" with open() function
    with open('sample.txt', "r") as file_object:
        # read file content
        data = file_object.read()
        # print file contents
        print(data)

    # Check if file is closed
    if file_object.closed == False:
        print('File is not closed')
    else:
        print('File is closed')

    print('**** "open with" statement & Exception handling ****')

    # File will be closed before handling the exception
    try:
        # using "with statement" with open() function
        with open('sample.txt', "r") as file_object:
            # read file content
            data = file_object.read()
            # it raises an error
            x = 1 / 0
            print(data)
    except:
        # handling exception
        print('An Error')
        if file_object.closed == False:
            print('File is not closed')
        else:
            print('File is closed')


    print('**** Multiple open() function calls in a single "with statement" ****')

    # Read from sample.txt and write in outfile.txt
    with open('outfile.txt', 'w') as file_obj_2, open('sample.txt', 'r') as file_obj_1:
        data = file_obj_1.read()
        file_obj_2.write(data)
        # Both the files will be closed automatically when execution block ends.

if __name__ == '__main__':
   main()
*** Open a file using without "open with" statement ***
Normal way of opening & reading from a file using open() function
This is a sample file.
It contains some sample string.
you are going to use it.
Thanks.
** Open a file using open() function & handle exception **
An Error
File is not closed
**** Open a file using "open with" statement ****
This is a sample file.
It contains some sample string.
you are going to use it.
Thanks.
File is closed
**** "open with" statement & Exception handling ****
An Error
File is closed
**** Multiple open() function calls in a single "with statement" ****

Advertisements

Исключения в Python

При выполнении программ могут возникать ошибки, для управления ими Python использует специальные объекты, называемые исключениями. Когда в программу включен код обработки исключения, ваша программа продолжится, а если нет, то программа остановится и выведет трассировку с отчетом об исключении. Исключения обрабатываются в блоках try-except. С блоками try-except программы будут работать даже в том случае, если что-то пошло не так.

3.1. Блоки try-except на Python

Приведем пример простой ошибки деления на ноль:

print(7/0)

Traceback (most recent call last):
  File «example.py», line 1, in <module>
    print(7/0)
ZeroDivisionError: division by zero

Если в вашей программе возможно появление ошибки, то вы можете заранее написать блок try-except для обработки данного исключения. Приведем пример обработки ошибки ZeroDivisionError с помощью блока try-except:

try:
    print(7/0)except ZeroDivisionError:
    print(«Деление на ноль запрещено»)

Команда print(7/0) помещена в блок try. Если код в блоке try выполняется успешно, то Python пропускает блок except.  Если же код в блоке try создал ошибку, то Python ищет блок except и запускает код в этом блоке. В нашем случае в блоке except выводится сообщение «Деление на ноль запрещено». При выполнение этого кода пользователь увидит понятное сообщение:

Деление на ноль запрещено

Если за кодом try-except следует другой код, то Python продолжит выполнение программы. 

3.2. Блок try-except-else на Python

Напишем простой калькулятор, который запрашивает данные у пользователя, а затем результат деления выводит на экран. Сразу заключим возможную ошибку деления на ноль  ZeroDivisionError и добавим блок else при успешном выполнение блока try.

:
    first_number = («Введите первое число: «)
     first_number == ‘q’:
        
    second_number = («Введите второе число: «)
     second_number == ‘q’:
        
    try:
        a = (first_number) / (second_number)
    except ZeroDivisionError:
        print(«Деление на ноль запрещено»)
    else:
        print(«Частное двух чисел равно {a}»)

Программа запрашивает у пользователя первое число (first_number), затем второе (second_number). Если пользователь не ввел » q » для завершения работы программа продолжается. В блок try помещаем код, в котором возможно появление ошибки. В случае отсутствия ошибки деления, выполняется код else и Python выводит результат на экран. В случае ошибки ZeroDivisionError выполняется блок except и выводится сообщение о запрете деления на ноль, а программа продолжит свое выполнение. Запустив код получим такие результаты:

Введите первое число: 30
Введите второе число: 5Частное двух чисел равно 6.0
Введите первое число: 7
Введите второе число: Деление на ноль запрещено
Введите первое число:  q

В результате действие программы при появлении ошибки не прервалось.

3.3. Блок  try-except с текстовыми файлами на Python

Одна из стандартных проблем при работе с файлами, это отсутствие необходимого файла, или файл находится в другом месте и Python не может его найти. Попробуем прочитать не существующий файл:

filename = ‘alice_2.txt’

with open(filename, encoding=’utf-8′) as file:
    contents = file.read()

Так как такого файла не существует, Python выдает исключение:

Traceback (most recent call last):
  File «example.py», line 3, in <module>
    with open(filename, encoding=’utf-8′) as file:
FileNotFoundError: No such file or directory: ‘alice_2.txt’

FileNotFoundError — это ошибка отсутствия запрашиваемого файла. С помощью блока try-except обработаем ее:

filename = ‘alice_2.txt’

try:
    with open(filename, encoding=’utf-8′) as file:
        contents = file.read()except FileNotFoundError:
    print(«Запрашиваемый файл {filename } не найден»)

В результате при отсутствии файла мы получим:

Запрашиваемый файл alice_2.txt не найден

3.4. Ошибки без уведомления пользователя

В предыдущих примерах мы сообщали пользователю об ошибках. В Python есть возможность обработать ошибку и не сообщать пользователю о ней и продолжить выполнение программы дальше. Для этого блок try пишется, как и обычно, а в блоке except вы прописываете Python не предпринимать никаких действий с помощью команды pass. Приведем пример ошибки без уведомления:

ilename = ‘alice_2.txt’

try:
    with open(filename, encoding=’utf-8′) as file:
        contents = file.read()except FileNotFoundError:
    pass

В результате при запуске этой программы и отсутствия запрашиваемого файла ничего не произойдет.

Please enable JavaScript to view the comments powered by Disqus.

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

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

Adblock
detector