Pythonlearn 07 Files
Pythonlearn 07 Files
Глава 7
Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772
http://www.py4e.com/code/mbox-short.txt
Открытие файла
• Прежде чем мы сможем прочитать содержимое файла,
нужно сообщить Пайтону, с каким файлом мы собираемся
работать и что будем с ним делать
Открыть
Читать
Писать
Закрыть
Ваша программа
Когда файлы отсутствуют
>>> fhand = open('stuff.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'stuff.txt'
Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772
Работа с файлом
Текстовый файл содержит символ перевода строки в конце
каждой строки:
From [email protected] Sat Jan 5 09:14:16 2008\n
Return-Path: <[email protected]>\n
Date: Sat, 5 Jan 2008 09:12:18 -0500\n
To: [email protected]\n
From: [email protected]\n
Subject: [sakai] svn commit: r39772 - content/branches/\n
\n
Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39772\n
Чтение файлов в Пайтон
Дескриптор файла как последовательность
• Дескриптор файла, открытый для
чтения, можно рассматривать как
последовательность строк, где каждая
строка файла — строка в xfile = open('mbox.txt')
последовательности for cheese in xfile:
print(cheese)
• Мы можем использовать оператор for,
чтобы последовательно перебирать
строки
• Подсчитываем строки и
выводим количество строк $ python open.py
Всего строк: 132045
Чтение файла *целиком*
>>> fhand = open('mbox-short.txt')
Мы можем прочитать весь >>> inp = fhand.read()
файл (всё содержимое и >>> print(len(inp))
переводы строк) в одну 94626
строку >>> print(inp[:20])
From stephen.marquar
Поиск по файлу
С помощью оператора if
внутри цикла for можно fhand = open('mbox-short.txt')
for line in fhand:
выводить только строки,
if line.startswith('From:') :
соответствующие print(line)
определённым критериям
Ой!
From: [email protected]
Что здесь делают все
эти пустые строки? From: [email protected]
From: [email protected]
From: [email protected]
...
Ой!
Что здесь делают все From: [email protected]\n
эти пустые строки? \n
From: [email protected]\n
• В конце каждой строки \n
файла находится символ From: [email protected]\n
\n
перевода строки
From: [email protected]\n
\n
• Оператор print добавляет ...
символ перевода строки к
каждой строке
Поиск по файлу (исправленный)
• Мы можем удалить пробелы
fhand = open('mbox-short.txt')
с правой стороны строки, for line in fhand:
используя rstrip() из line = line.rstrip()
if line.startswith('From:') :
библиотеки работы со print(line)
строками
From: [email protected]
• Строка, содержащая символ
From: [email protected]
перевода строки, считается From: [email protected]
«пустым пространством» и From: [email protected]
удаляется ....
Пропуск с использованием continue
fhand = open('mbox-short.txt')
Если нужно, мы for line in fhand:
можем пропустить line = line.rstrip()
строку, используя if not line.startswith('From:') :
оператор continue continue
print(line)
Используем in, чтобы выбрать строки
Мы можем поискать fhand = open('mbox-short.txt')
for line in fhand:
подстроку в (in) любой line = line.rstrip()
строке (line), используя if not '@uct.ac.za' in line :
continue
соответствующий критерий print(line)
поиска
From [email protected] Sat Jan 5 09:14:16 2008
X-Authentication-Warning: set sender to [email protected] using –f
From: [email protected]
Author: [email protected]
From [email protected] Fri Jan 4 07:02:32 2008
X-Authentication-Warning: set sender to [email protected] using -f...
fname = input('Введите имя файла: ')
fhand = open(fname)
count = 0
Запрос имени
for line in fhand:
if line.startswith('Subject:') : файла
count = count + 1
print('Найдено', count, ‘строк, содержащих subject в', fname)
count = 0
for line in fhand:
if line.startswith('Subject:') :
count = count + 1
print(‘Найдено', count, ‘строк, содержащих subject в', fname)