Опубликован: 14.06.2015 | Доступ: свободный | Студентов: 7371 / 1135 | Длительность: 09:49:00
Авторские права: Creative Commons Attribution 3.0
Самостоятельная работа 7:

Файлы

< Самостоятельная работа 1 || Самостоятельная работа 7: 12

По ссылке youtube выложено видео с русскими титрами.

14.1. Введение

До сих пор мы учились тому, как писать программы и сообщать о наших намерениях центральному процессору (Central Processing Unit), используя условные инструкции, функции и итерации. Мы учились, как создавать и использовать структуры данных в оперативной памяти (Main Memory). В CPU и памяти работает и выполняется наше программное обеспечение (ПО).

Здесь происходит "мышление".

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


В этой главе мы начинаем работать с вторичной памятью (Secondary Memory) или файлами. Вторичная память не очищается, когда выключается электричество. В случае с USB-флешками, данные можно на них записать, после этого USB-флешки могут быть удалены из системы и перенесены в другую систему.

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

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

Когда мы хотим прочитать или записать файл (скажем, на жестком диске), во-первых мы должны открыть этот файл. Об открытии файла сообщается операционной системе (ОС), которая знает, где хранятся данные для каждого из файлов. Когда вы открываете файл, вы обращаетесь к ОС, чтобы найти файл по имени и удостовериться, что файл существует. В следующем примере мы открываем файл mbox.txt, который должен находиться в той же папке, откуда запускается Python. Скачать файл можно по ссылке:

http://pycode.ru/files/python/mbox.txt

>>> fhand = open('mbox.txt')
>>> print(fhand)
<_io.TextIOWrapper name='mbox.txt' mode='r' encoding='cp1251'>

Если функция open завершится успешно, то ОС вернет дескриптор файла (file handle). Дескриптор файла не является действующими данными, содержащимися в файле, это "обработчик", который мы можем использовать для чтения данных. У вас есть дескриптор, если запрашиваемый файл существует и имеет надлежащие права на чтение.


Если файл не существует, функция open выдаст ошибку с указанием причины и вы не получите дескриптор с доступом к содержимому файла:

>>> fhand = open('stuff.txt')
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
fhand = open('staff.txt')
IOError: [Errno 2] No such file or directory: 'staff.txt'

Позже мы воспользуемся инструкциями try и except, чтобы сделать более изящной обработку ситуации, когда мы открываем файл, который не существует.

14.3. Текстовый файл и строки

Текстовый файл можно представить как последовательность строк. В качестве примера рассмотрим текстовый файл, который содержит записи почтовой активности от различных лиц в команде разработчиков проекта с открытым исходным кодом:

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008
Return-Path: <postmaster@collab.sakaiproject.org>
Date: Sat, 5 Jan 2008 09:12:18 -0500
To: source@collab.sakaiproject.org
From: stephen.marquard@uct.ac.za
Subject: [sakai] svn commit: r39772 - content/branches/
Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772
...

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

http://pycode.ru/files/python/mbox.txt и сокращенная версия

http://pycode.ru/files/python/mbox-short.txt. Это файлы, которые содержат множество почтовых сообщений в стандартном формате. Строки, которые начинаются с "From " отделяют сообщение и строки, которые начинаются с "From:" являются частью сообщения. Более подробная информация по ссылке: en.wikipedia.org/wiki/Mbox.

Чтобы разбить файл на строки, существует специальный символ, который представляет "конец строки" и называется символом новой строки.

В Python мы представляем символ новой строки, как строковую константу '\n'. Даже не смотря на то, что это выглядит как два символа - на самом деле один символ. Когда мы смотрим переменную, введя "stuff" в интерпретаторе, она отображается с \n в строке, но когда мы используем функцию print - видим, что строка разбилась на две по символу новой строки.

>>> stuff = 'Hello\nWorld!'
>>> stuff
'Hello\nWorld!'
>>> print(stuff)
Hello
World!
>>> len(stuff)
12
>>>

Также можно видеть, что длина строки 'Hello\nWorld!' составляет 12 символов, т.к. новый символ считается за один.

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

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008\n
Return-Path: <postmaster@collab.sakaiproject.org>\n
Date: Sat, 5 Jan 2008 09:12:18 -0500\n
To: source@collab.sakaiproject.org\n
From: stephen.marquard@uct.ac.za\n
Subject: [sakai] svn commit: r39772 - content/branches/\n
Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772\n
...

Таким образом, символ новой строки отделяет символы в файле внутри строк.

< Самостоятельная работа 1 || Самостоятельная работа 7: 12
Алексей Виноградов
Алексей Виноградов

Видеокурс выложен на сайте Altube.ru вместо Youtube и плеер Altube не поддерживает субтитры. Прошу решить вопрос о предоставлении русских субтитров в этом англоязычном видеокурсе.

Петр Олейников
Петр Олейников

Данные файлы неоходимы не только для самостоятельных работ, но и для тестов. А по ссылкам в лекциях они не доступны, выдает ошибку 404.