Python: работа с файлами

Автор: | 24/08/2014
 

PythonДля работы с файлами в Python используется встроенная функция open():

Help on built-in function open in module __builtin__:

open(...)
    open(name[, mode[, buffering]]) -> file object

    Open a file using the file() type, returns a file object.  This is the
    preferred way to open a file.

С помощью open() создаётся новый объект, над которым потом можно выполнять другие действия.

Полный список методов можно получить с помощью функции dir():

In [25]: dir(file)
Out[25]:
['__class__',
 '__delattr__',
 '__doc__',
 '__enter__',
 '__exit__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__iter__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'close',
 'closed',
 'encoding',
 'errors',
 'fileno',
 'flush',
 'isatty',
 'mode',
 'name',
 'newlines',
 'next',
 'read',
 'readinto',
 'readline',
 'readlines',
 'seek',
 'softspace',
 'tell',
 'truncate',
 'write',
 'writelines',
 'xreadlines']

Для завершения работы – используется метод close(), применяемый к созданном объекту.

In [15]: text = 'This is text fro new file.n'

In [16]: file = open('newfile', 'w')

In [17]: file.close()

Функция open() принимает первым аргументом имя файла, и вторым – режим доступа:

w (write) – для записи;
r (read) – чтение файла;
a (append) – добавление строк в файл;
r+ (read+) – чтение и/или запись.

Полный список методов можно найти тут>>>.

Второй аргумент не обязателен – если вызвать open() без него – то по-умолчанию будет использоваться режим read.

Добавление текста в файл выполняется методом write() (для записи одной строки) или writelines() (для записи нескоких строк, переданных в виде списка).

In [28]: file = open('onelinefile', 'w')

In [29]: file.write('This is text line in new file.')

In [33]: file.close()

In [52]: file = open('multilinefile', 'w')

In [54]: longtext = ('nThis is first string;n', 'This is second string;n', 'This is third string.')

In [55]: file.writelines(longtext)

In [57]: file.close()

После чего у нас в файловой системе появятся два новых файла:

$ ls -l | grep file
-rw-rw-r-- 1 setevoy setevoy 67 Aug 24 13:45 multilinefile
-rw-rw-r-- 1 setevoy setevoy 30 Aug 24 13:43 onelinefile

Для чтения из файла – методы read() (читает указанное аргументом количество байт, если не указано – читает весь файл), readline() (читает одну строку) и readlines() (читает все строки в объекте-файле):

In [59]: file.read(10)
Out[59]: 'This is te'
In [84]: file.read()
Out[84]: 'nThis is first string;nThis is second string;nThis is third string.'
In [66]: file.readline()
Out[66]: 'This is text line in new file.'

In [70]: file.close()

In [71]: file = open('multilinefile', 'r+')

In [72]: file.readlines()
Out[72]:
['n',
'This is first string;n',
'This is second string;n',
'This is third string.']

In [76]: print file.readlines()
['n', 'This is first string;n', 'This is second string;n', 'This is third string.']

Другой способ чтения строк из файла – с помощью цикла for:

In [80]: file = open('multilinefile', 'r+')

In [81]: for string in file:
    print string,
   ....:

This is first string;
This is second string;
This is third string.

In [82]: file.close()

При использовании метода readline() необходимо учитывать, что при каждой итерации (вызова read() к объекту) – он будет считывать следующую строку, а не начинать сначала:

In [86]: file = open('multilinefile', 'r+')

In [87]: file.readline()
Out[87]: 'n'

In [88]: file.readline()
Out[88]: 'This is first string;n'

In [89]: file.readline()
Out[89]: 'This is second string;n'

In [90]: file.readline()
Out[90]: 'This is third string.'

In [91]: file.readline()
Out[91]: ''

In [92]: file.close()

Хорошим способом работы с файлами является использование оператора With, т.к. он всегда выполняет close(), и не оставляет “мусора”:

In [94]: with open('multilinefile', 'r+') as file:
   ....:     strings = file.readlines()
   ....:     print strings
   ....:
['n', 'This is first string;n', 'This is second string;n', 'This is third string.']

Т.к. методы read* возвращают обычный строковый объект- над ним можно выполнять обычные строковые методы:

In [115]: file = open('newfile', 'r+')

In [116]: file.write('string')

In [117]: result = file.readline()

In [118]: print type(result)
<type 'str'>
In [100]: with open('multilinefile', 'r+') as file:
    strings = file.readlines()
    for lines in strings:
        result = lines.split()
        print result
   .....:
[]
['This', 'is', 'first', 'string;']
['This', 'is', 'second', 'string;']
['This', 'is', 'third', 'string.']

Ссылки по теме

https://thenewcircle.com

https://docs.python.org

http://www.tutorialspoint.com