Работа с файлами в питоне
Обьекты питона состоят из данных и методов . Рассмотрим код :
aFile = open ( 'someFile.txt', 'w' )
aFile - это обьект , имеющий атрибуты :
aFile.closed
aFile.encoding
aFile.mode
aFile.name
aFile.newlines
aFile.softSpace
Также у этого обьекта имеются собственные методы :
aFile.close()
aFile.flush()
aFile.fileno()
aFile.isatty()
aFile.next()
aFile.read()
aFile.readline()
aFile.readlines()
aFile.xreadlines()
aFile.seek()
aFile.tell()
aFile.truncate()
aFile.write()
aFile.writelines()
Откроем файл на запись :
fileHandle = open ( 'test.txt', 'w' )
Теперь запишем данные в этот файл :
fileHandle.write ( 'This is a test.\nReally, it is.' )
fileHandle.close()
Для добавления информации в конец файла
fileHandle = open ( 'test.txt', 'a' )
fileHandle.write ( '\n\n\nBottom line.' )
fileHandle.close()
Прочитаем файл и распечатаем всё его содержимое :
fileHandle = open ( 'test.txt' )
print fileHandle.read()
fileHandle.close()
Прочитаем файл и распечатаем одну строку :
fileHandle = open ( 'test.txt' )
print fileHandle.readline() # "This is a test."
fileHandle.close()
Можно сохранить строки файла в список
fileHandle = open ( 'test.txt' )
fileList = fileHandle.readlines()
for fileLine in fileList:
print '>>', fileLine
fileHandle.close()
Содержимое файла можно сохранить в переменной :
fileHandle = open ( 'test.txt' )
garbage = fileHandle.readline()
fileHandle.readline() # "Really, it is."
fileHandle.close()
Можно открыть файл с определенной позиции :
fileHandle = open ( 'test.txt' )
garbage = fileHandle.readline()
fileHandle.seek ( 0 )
print fileHandle.readline() # "This is a test."
fileHandle.close()
Можно прочитать в файле несколько байт :
fileHandle = open ( 'test.txt' )
print fileHandle.read ( 1 ) # "T"
fileHandle.seek ( 4 )
print FileHandle.read ( 1 ) # "T"
Для работы с файловой системой необходимо использовать модули os и stat .
В следующем примере собирается информация о файле
import os
import stat
import time
fileStats = os.stat ( 'test.txt' )
fileInfo = {
'Size' : fileStats [ stat.ST_SIZE ],
'LastModified' : time.ctime ( fileStats [ stat.ST_MTIME ] ),
'LastAccessed' : time.ctime ( fileStats [ stat.ST_ATIME ] ),
'CreationTime' : time.ctime ( fileStats [ stat.ST_CTIME ] ),
'Mode' : fileStats [ stat.ST_MODE ]
}
for infoField, infoValue in fileInfo:
print infoField, ':' + infoValue
if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ):
print 'Directory. '
else:
print 'Non-directory.'
Можно получить информацию о некоторых типах файлов :
import os
import stat
fileStats = os.stat ( 'test.txt' )
fileMode = fileStats [ stat.ST_MODE ]
if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ):
print 'Regular file.'
elif stat.S_ISDIR ( fileSTats [ stat.ST_MODe ] ):
print 'Directory.'
elif stat.S_ISLNK ( fileSTats [ stat.ST_MODe ] ):
print 'Shortcut.'
elif stat.S_ISSOCK ( fileSTats [ stat.ST_MODe ] ):
print 'Socket.'
elif stat.S_ISFIFO ( fileSTats [ stat.ST_MODe ] ):
print 'Named pipe.'
elif stat.S_ISBLK ( fileSTats [ stat.ST_MODe ] ):
print 'Block special device.'
elif stat.S_ISCHR ( fileSTats [ stat.ST_MODe ] ):
print 'Character special device.'
Можно получить базовую информацию :
import os.path
fileStats = 'test.txt'
if os.path.isdir ( fileStats ):
print 'Directory.'
elif os.path.isfile ( fileStats ):
print 'File.'
elif os.path.islink ( fileStats ):
print 'Shortcut.'
elif os.path.ismount ( fileStats ):
print 'Mount point.'
Распечатать содержимое директории :
import os
for fileName in os.listdir ( '/' ):
print fileName
Создание директории :
import os
os.mkdir ( 'testDirectory' )
Удаление директории :
import os
os.rmdir ( 'testDirectory )
Создание нескольких директорий
import os
os.makedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' )
Точно также мы можем их удалить , при условии , что ничего туда не добавили :
import os
os.removedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' )
В следующем примере распечатаем содержимое всех файлов с расширением .txt и название
файлов с расширением .exe :
import fnmatch
import os
for fileName in os.listdir ( '/' ):
if fnmatch.fnmath ( fileName, '*.txt' ):
print open ( fileName ).read()
elif fnmatch.fnmatch ( fileName, '*.exe' ):
print fileName
Найдем все файлы с расширением .txt , которые в названии состоят из одного символа :
import fnmatch
import os
for fileName in os.listdir ( '/' ):
if fnmatch.fnmatch ( fileName, '?.txt' ):
print 'Text file.'
Найдем все файлы с расширением .txt :
import fnmatch
import os
import re
filePattern = fnmatch.translate ( '*.txt' )
for fileName in os.listdir ( '/' ):
if re.match ( filePattern, fileName ):
print 'Text file.'
Найдем еще раз все файлы с расширением .txt :
import glob
for fileName in glob.glob ( '*.txt' ):
print 'Text file.'
Найдем все файлы с расширением .txt , у которых в названии одна цифра:
import glob
for fileName in glob.glob ( '[0-9].txt' ):
print fileName
Для записи в файл массива строк можно использовать модуль pickle
import pickle
fileHandle = open ( 'pickleFile.txt', 'w' )
testList = [ 'This', 2, 'is', 1, 'a', 0, 'test.' ]
pickle.dump ( testList, fileHandle )
fileHandle.close()
Сохранение строк файла в массив
import pickle
fileHandle = open ( 'pickleFile.txt' )
testList = pickle.load ( fileHandle )
fileHandle.cloes()
Более сложный вариант с сохранением в файл сложных обьектов :
import pickle
fileHandle = open ( 'pickleFile.txt', 'w' )
testList = [ 123, { 'Calories' : 190 }, 'Mr. Anderson', [ 1, 2, 7 ] ]
pickle.dump ( testList, fileHandle )
fileHandle.close()
import pickle
fileHandle = open ( 'pickleFile.txt' )
testList = pickle.load ( fileHandle )
fileHandle.close()
Модуль сЗickle похож по своему поведению на pickle , но более быстр :
import cPickle
fileHandle = open ( 'pickleFile.txt', 'w' )
cPickle.dump ( 1776, fileHandle )
fileHandle.close()
Можно создавать файлы и обрабатывать их в памяти с помощью модуля StringIO
import StringIO
fileHandle = StringIO.StringIO ( "Let freedom ring." )
print fileHandle.read() # "Let freedom ring."
fileHandle.close()
Модуль cStringIO работает аналогично , но быстрее :
import cStringIO
fileHandle = cStringIO.cStringIO ( "To Kill a Mockingbird" )
print fileHandle.read() # "To Kill a Mockingbid"
fileHandle.close()
|
Garry | Спасибо за ваше старание! Сайт очень полезен для начианющих! Безполезной информации еще не видел... 2011-02-12 04:37:47 | Roman | Спасибо! Очень полезно, указывает где копать, работает как трамплин:) 2011-09-27 10:51:57 | twerp | Большое спасибо!
Отличный справочник!
Трамплин :) 2012-04-06 13:39:09 | Сергей | Спасибо, очень помогло 2013-02-18 19:16:59 | Юрий | Спасибо, помогло 2014-04-13 04:29:41 | |
|
|