Основы доступа к файлам

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Ввод и вывод файлов

Открыть файл.

f = open('foo.txt', 'rt')     ## Открыть для чтения (текст)
g = open('bar.txt', 'wt')     ## Открыть для записи (текст)

Прочитать все данные.

data = f.read()

## Прочитать только до 'maxbytes' байт
data = f.read([maxbytes])

Написать некоторый текст.

g.write('some text')

Закрыть, когда закончите.

f.close()
g.close()

Файлы должны быть закрыты правильно, и это легко забыть. Таким образом, предпочтительным подходом является использование инструкции with следующим образом.

with open(filename, 'rt') as file:
    ## Использовать файл `file`
  ...
    ## Не нужно закрывать явно
...инструкции

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

Общие习惯用法 для чтения данных из файла

Прочитать весь файл сразу в виде строки.

with open('foo.txt', 'rt') as file:
    data = file.read()
    ## `data` - это строка с всей текстовой информацией из `foo.txt`

Прочитать файл построчно с использованием итерации.

with open(filename, 'rt') as file:
    for line in file:
        ## Обработать строку

Общие习惯用法 для записи в файл

Записать строковые данные.

with open('outfile', 'wt') as out:
    out.write('Hello World\n')
 ...

Перенаправить функцию print.

with open('outfile', 'wt') as out:
    print('Hello World', file=out)
 ...

Эти упражнения зависят от файла portfolio.csv. Файл содержит список строк с информацией о портфеле акций. Предполагается, что вы работаете в каталоге ~/project/. Если вы не уверены, вы можете узнать, где Python считает, что он запущен, выполнив это:

>>> import os
>>> os.getcwd()
'/home/labex/project' ## Output vary
>>>

Упражнение 1.26: Введение в файлы

Во - первых, попробуйте прочитать весь файл сразу в виде большой строки:

>>> with open('portfolio.csv', 'rt') as f:
        data = f.read()

>>> data
'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'
>>> print(data)
name,shares,price
"AA",100,32.20
"IBM",50,91.10
"CAT",150,83.44
"MSFT",200,51.23
"GE",95,40.37
"MSFT",50,65.10
"IBM",100,70.44
>>>

В приведенном выше примере следует отметить, что Python имеет два режима вывода. В первом режиме, когда вы вводите data в提示符, Python показывает вам необработанное строковое представление, включая кавычки и escape - коды. Когда вы вводите print(data), вы получаете фактический отформатированный вывод строки.

Хотя чтение файла сразу целиком простой, это часто не самый подходящий способ, особенно если файл碰巧 огромен или содержит строки текста, которые вы хотите обрабатывать по одной.

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

>>> with open('portfolio.csv', 'rt') as f:
        for line in f:
            print(line, end='')

name,shares,price
"AA",100,32.20
"IBM",50,91.10
...
>>>

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

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

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f)
>>> headers
'name,shares,price\n'
>>> for line in f:
    print(line, end='')

"AA",100,32.20
"IBM",50,91.10
...
>>> f.close()
>>>

next() возвращает следующую строку текста в файле. Если бы вы вызывали его повторно, вы получили бы последовательные строки. Однако, чтобы вы знали, цикл for уже использует next() для получения своих данных. Таким образом, вы обычно не вызываете его напрямую, если не пытаетесь явно пропустить или прочитать одну строку, как показано.

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

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f).split(',')
>>> headers
['name','shares', 'price\n']
>>> for line in f:
    row = line.split(',')
    print(row)

['"AA"', '100', '32.20\n']
['"IBM"', '50', '91.10\n']
...
>>> f.close()

Примечание: В этих примерах явно вызывается f.close(), потому что не используется инструкция with.

Упражнение 1.27: Чтение файла с данными

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

Столбцы в portfolio.csv соответствуют названию акции, количеству акций и цене покупки одной акционной позиции. Напишите программу под названием pcost.py в каталоге /home/labex/project, которая открывает этот файл, читает все строки и вычисляет, сколько стоило купить все акции в портфеле.

Подсказка: чтобы преобразовать строку в целое число, используйте int(s). Чтобы преобразовать строку в число с плавающей точкой, используйте float(s).

Ваша программа должна выводить результат в таком виде:

Total cost 44671.15
✨ Проверить решение и практиковаться

Упражнение 1.28: Другие виды "файлов"

Что если вы хотели прочитать не текстовый файл, такой как сжатый gzip - файл с данными? Встроенная функция open() здесь не поможет вам, но в Python есть библиотечный модуль gzip, который может читать gzip - сжатые файлы.

Попробуйте:

>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as f:
    for line in f:
        print(line, end='')

... посмотрите на вывод...
>>>

Примечание: Включение режима файла 'rt' здесь至关重要. Если вы забыть это, вы получите байтовые строки вместо обычных текстовых строк. (这里的“至关重要”原文是“критично”,翻译为“критично”更符合技术文档的风格,但为了让读者更易理解,也可解释性地翻译为“至关重要”)

Комментарий: Неужели мы должны использовать Pandas для этого?

Данные ученые быстро отмечают, что библиотеки, такие как Pandas, уже имеют функцию для чтения CSV - файлов. Это правда - и она работает довольно хорошо. Однако, это не курс по изучению Pandas. Чтение файлов - более общая проблема, чем специфика CSV - файлов. Основная причина, по которой мы работаем с CSV - файлом, заключается в том, что это знакомый формат для большинства программистов и он относительно легко обрабатывать напрямую - иллюстрируя многие особенности Python в процессе. Поэтому, по возможности, используйте Pandas, когда вернетесь к работе. Однако, на протяжении остальной части этого курса мы будем держаться стандартной функциональности Python.

Резюме

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