Импорт текстового файла или связывание с ним
Существует два способа переноса данных из текстового файла в Access. Если вы хотите создать копию данных, доступную для изменения в Access, файл следует импортировать в новую или существующую таблицу с помощью мастера импорта текстовых файлов. Если вы просто хотите просматривать обновленные исходные данные в Access и использовать расширенные функции запросов и отчетов, создайте в базе данных связь с текстовым файлом с помощью мастера связывания с текстовыми файлами.
В этой статье подробно описываются процедуры импорта и связывания с текстовым файлом с помощью мастеров.
В этой статье
- Текстовые файлы и поддерживаемые форматы
- Импорт данных из текстового файла
- Что еще важно знать об импорте
- Решение проблем, связанных с отсутствующими и неверными значениями в импортированной таблице
- Создание связи с текстовым файлом
- Решение проблем со значением #ЧИСЛО! и неверными значениями в связанной таблице
Текстовые файлы и поддерживаемые форматы
Текстовый файл содержит читаемые знаки без форматирования (например, буквы и цифры) и специальные символы (такие как табуляция, перевод строки и возврат каретки). Access поддерживает следующие расширения для имени файла: TXT, CSV, ASC и TAB.
Чтобы использовать текстовый файл в качестве источника для импорта или связывания, необходимо структурировать его содержимое таким образом, чтобы мастера импорта и связывания могли разделить его на записи (строки), а каждую запись — на поля (столбцы). Текстовые файлы с правильной структурой делятся на два типа:
-
Файлы с разделителями. В таких файлах каждая запись располагается на отдельной строке, а поля отделяются друг от друга одним символом (разделителем). Разделителем может служить любой знак, который не используется в значениях полей, например знак табуляции, точка с запятой, запятая, пробел и т. д. Ниже приведен пример текста с разделителями-запятыми.
1,Company A,Anna,Bedecs,Owner 2,Company C,Thomas,Axen,Purchasing Rep 3,Company D,Christina,Lee,Purchasing Mgr. 4,Company E,Martin,O’Donnell,Owner 5,Company F,Francisco,Pérez-Olaeta,Purchasing Mgr. 6,Company G,Ming-Yang,Xie,Owner 7,Company H,Elizabeth,Andersen,Purchasing Rep 8,Company I,Sven,Mortensen,Purchasing Mgr. 9,Company J,Roland,Wacker,Purchasing Mgr. 10,Company K,Peter,Krschne,Purchasing Mgr. 11,Company L,John,Edwards,Purchasing Mgr. 12,Company M,Andre,Ludo,Purchasing Rep 13,Company N,Carlos,Grilo,Purchasing Rep
1 Company A Anna Bedecs Owner 2 Company C Thomas Axen Purchasing Rep 3 Company D Christina Lee Purchasing Mgr. 4 Company E Martin O’Donnell Owner 5 Company F Francisco Pérez-Olaeta Purchasing Mgr. 6 Company G Ming-Yang Xie Owner 7 Company H Elizabeth Andersen Purchasing Rep 8 Company I Sven Mortensen Purchasing Mgr. 9 Company J Roland Wacker Purchasing Mgr. 10 Company K Peter Krschne Purchasing Mgr. 11 Company L John Edwards Purchasing Mgr. 12 Company M Andre Ludo Purchasing Rep 13 Company N Carlos Grilo Purchasing Rep
Импорт данных из текстового файла
Если вы хотите сохранить все данные текстового файла или их часть в базе данных Access, содержимое файла следует импортировать в новую таблицу или добавить к существующей. Импортированные данные можно просматривать и редактировать, не влияя на исходный текстовый файл.
В ходе импорта вы можете задать структуру исходного файла и выбрать вариант импорта: в новую или существующую таблицу.
Совет: Если вы не знакомы с таблицами или структурой базы данных, см. статьи Создание таблиц в базе данных и Основные сведения о создании баз данных.
В конце импорта можно сохранить сведения о нем в виде спецификации. Спецификация позволяет выполнять импорт повторно без использования мастера.
Стандартные сценарии импорта текстового файла в Access
Как правило, текстовые данные импортируются в Access по следующим причинам:
- Часть данных хранится в формате, который не поддерживается в Access, но их требуется использовать в базе данных. Исходные данные можно сначала экспортировать в текстовый файл, а затем импортировать этот файл в таблицу Access.
- Вы используете Access для управления данными, но при этом регулярно получаете данные в текстовом формате от пользователей другой программы. Импорт данных выполняется регулярно, и вы хотите упростить этот процесс для экономии времени и усилий.
Примечание: Если открыть в Access текстовый файл (для этого нужно выбрать в списке Тип файлов диалогового окна Открытие файла базы данных значение Все файлы и щелкнуть нужный текстовый файл), Access запустит мастер связывания с текстовыми файлами, который позволяет создать ссылку на текстовый файл, вместо того чтобы импортировать его содержимое. Связывание с файлом отличается от импорта его содержимого. Дополнительные сведения о связывании с текстовыми файлами см. в разделе Создание связи с текстовым файлом далее в этой статье.
Подготовка исходного файла
- Откройте исходный файл в текстовом редакторе, например в Блокноте.
Примечание: В ходе одной операции импорта можно импортировать лишь один текстовый файл. Чтобы импортировать несколько файлов, повторите импорт для каждого из них.
- «Ольга Зуева»,25,4.5.2017,»Нижний Новгород»
- «Глеб Селезнев»,27,2018,»Вологда»
Знак, используемый для ограничения значения поля, называется ограничителем текста. Ограничители не являются обязательными, но их рекомендуется использовать в следующих случаях:
- Разделитель является частью значения поля. Например, если в качестве разделителя используется запятая, а значение поля равно Самара, Вологда, его придется заключить в ограничители: «Самара, Вологда».
- Вы хотите, чтобы Access обрабатывал нетекстовые значения, например 0452934 и 0034539, как текстовые и хранил их в текстовом поле.
Во время импорта можно указать, используется ли в файле ограничитель, и, если он используется, задать соответствующий знак.
Убедитесь в том, что во всем файле используется один ограничитель текста и что он применяется только к текстовым значениям.
Число исходных полей не должно превышать 255 , так как Access поддерживает не более 255 полей в таблице.
Пропуск записей и значений
Если вам нужно перенести лишь часть текстового файла, его следует отредактировать перед началом импорта, так как пропуск записей в ходе операции невозможен.
Если вы добавляете данные в новую таблицу, некоторые поля можно пропустить, но этот вариант не поддерживается при добавлении в существующую таблицу. В последнем случае структура исходных данных должна соответствовать структуре конечной таблицы. Другими словами, в исходном файле должно быть то же число столбцов, что и в конечной таблице, а типы данных должны совпадать с типами данных в конечной таблице.
Пустые строки и поля
Удалите все лишние пустые строки из файла. При наличии пустых полей добавьте в них отсутствующие данные. Если вы планируете добавить записи в существующую таблицу, убедитесь, что соответствующие поля таблицы допускают использование значений NULL. Поле может принимать значения NULL, если для его свойства Обязательное поле задано значение Нет, а свойство Условие на значение не запрещает значения NULL.
Найдите и удалите лишние символы (табуляции, перевода строки, возврата каретки).
Чтобы избежать ошибок при импорте, убедитесь, что типы данных в полях одинаковы для всех строк. Access считывает первые 25 строк файла, чтобы определить тип данных для полей таблицы. Настоятельно рекомендуем убедиться в том, что первые 25 исходных строк не содержат данные разных типов. Кроме того, нетекстовые значения, которые требуется обрабатывать как текстовые, необходимо заключить в одинарные или двойные кавычки.
Если исходный файл содержит смешанные значения в строках, идущих после 25-й строки, они могут быть пропущены или неправильно преобразованы при импорте. Сведения об устранении проблем см. в разделе Решение проблем, связанных с отсутствующими и неверными значениями в импортированной таблице далее в этой статье.
Если файл с разделителями не содержит имена полей, их рекомендуется указать в первой строке. В ходе импорта можно настроить мастер так, чтобы значения в первой строке считались именами полей. При импорте файлов с полями фиксированного размера такая возможность недоступна.
Примечание: Если вы добавляете файл с полями фиксированного размера в существующую таблицу, убедитесь, что имя каждого столбца в точности соответствует имени поля. Если они отличаются, импорт завершится сбоем. Чтобы просмотреть имена полей, откройте конечную таблицу в режиме конструктора.
Запуск импорта в Access
- Откройте базу данных Access, в которой будут храниться импортируемые данные. Если ни одна из существующих баз данных не подходит для этого, создайте пустую базу данных.
- Перед началом импорта следует определить, в какой таблице будут храниться данные: в новой или существующей.
- Создание новой таблицы. Если необходимо сохранить данные в новой таблице, в Access создается таблица, в которую добавляются импортируемые данные. Если таблица с указанным именем уже существует, ее содержимое перезаписывается импортируемыми данными.
- Добавление в существующую таблицу. Если используется существующая таблица, при импорте данные добавляются в нее. Следует помнить, что ошибки в ходе добавления зачастую объясняются тем, что исходные данные не соответствуют структуре и параметрам полей в конечной таблице. Чтобы избежать таких ошибок, откройте таблицу в режиме конструктора и проверьте следующее:
- Первая строка. Если в первой строке исходного текстового файла нет имен полей, убедитесь, что столбцы в этом файле расположены в том же порядке и имеют тот же тип данных, что и в таблице. Если первая строка файла с разделителями содержит заголовки столбцов, совпадение порядка столбцов и полей необязательно, но имя и тип данных каждого столбца должны в точности совпадать с именем и типом данных соответствующего поля. При импорте файлов с полями фиксированного размера такая возможность недоступна.
- Отсутствующие или лишние поля. Если в конечной таблице отсутствует одно или несколько полей, добавьте их до начала импорта. Если же таблица содержит поля, отсутствующие в исходном файле, их не требуется удалять из таблицы, если для них разрешены значения NULL.
Совет: Поле может принимать значения NULL, если для его свойства Обязательное поле задано значение Нет, а свойство Условие на значение не запрещает значения NULL.

- Если вы используете Access 2019 или последнюю версию Access, которая предоставляется по подписке на Microsoft 365, на вкладке Внешние данные в группе Импорт и связи нажмите кнопку Создать источник данных и выберите Из файла >Текстовый файл.
- Если вы используете Access 2016, Access 2013 или Access 2010, на вкладке Внешние данные в группе Импорт и связи нажмите кнопку Текстовый файл.
- Чтобы сохранить данные в новой таблице, выберите вариант Импортировать данные источника в новую таблицу в текущей базе данных. Позднее будет предложено указать имя этой таблицы.
- Чтобы добавить данные в существующую таблицу, выберите параметр Добавить копию записей в конец таблицы и выберите таблицу в раскрывающемся списке.
Примечание: Сведения о связывании с источником данных путем создания связанной таблицы см. ниже в разделе Создание связи с текстовым файлом.
Примечание: Если исходный текстовый файл содержит знаки табуляции или другие специальные знаки, в мастере импорта текстовых файлов они отображаются в виде полей между столбцами данных.
Примечание: Страница мастера, на которой можно указать сведения об импортируемых полях, не отображается при добавлении записей в существующую таблицу.
Примечание: Страница мастера, на которой можно указать сведения об импортируемых полях, не отображается при добавлении записей в существующую таблицу.
Что еще важно знать об импорте
- Сведения о том, как сохранить сведения об импорте в виде спецификации, которую можно использовать повторно, см. в статье Сохранение параметров операции импорта или экспорта в виде спецификации.
- Дополнительные сведения о запуске спецификаций см. в статье Выполнение сохраненной операции импорта или экспорта.
- Дополнительные сведения о запуске спецификаций в определенное время см. в статье Планирование импорта или экспорта.
- Сведения о том, как изменить имя спецификации, удалить ее или обновить имена исходных файлов, см. в статье Задачи управления данными.
Решение проблем, связанных с отсутствующими и неверными значениями в импортированной таблице
Сообщение Ошибка при попытке импорта файла свидетельствует о том, что импорт завершился сбоем. Если же после импорта отображается страница, на которой предлагается сохранить сведения об операции, это означает, что данные были полностью или частично импортированы. В сообщении о состоянии указывается также имя таблицы, которая содержит описание всех ошибок, возникших в ходе импорта.
Важно отметить, что даже если в сообщении о состоянии указано, что операция завершилась успешно, перед использованием таблицы следует просмотреть ее содержимое и структуру, чтобы убедиться в правильности всех данных.
Откройте конечную таблицу в режиме таблицы, чтобы убедиться в том, что в таблицу были успешно добавлены все данные. После этого откройте таблицу в режиме конструктора, чтобы проверить типы данных и параметры свойств для полей.
В приведенной ниже таблице описаны действия по разрешению проблем, связанных с отсутствующими или неверными значениями.
Совет: Если вы обнаружили лишь несколько отсутствующих значений, можно добавить их в таблицу вручную в режиме таблицы. Если же отсутствует или неправильно импортирован целый столбец либо большой объем данных, следует исправить исходный файл. После устранения всех возможных проблем повторите импорт.
Значения –1 или 0
Если в исходном файле есть поле, которое содержит только значения «Истина» или «Ложь» либо только значения «Да» или «Нет», и для этого поля выбран тип данных «Логический», в таблице появятся значения –1 и 0. Откройте таблицу в режиме конструктора и задайте для свойства Формат значение Истина/Ложь или Да/Нет.
В Access импорт нескольких значений в одно поле не поддерживается. Список значений обрабатывается как одно значение и помещается в тестовое поле. Значения в поле разделяются точкой с запятой.
В случае усечения данных в столбце попытайтесь увеличить его ширину в режиме таблицы. Если устранить проблему таким образом не удается, возможно, причина в том, что числовое поле имеет тип Длинное целое вместо Двойное с плавающей точкой.
Отсутствуют данные в поле первичного ключа или индексированном поле
Импортируемые записи могут содержать повторяющиеся значения, которые невозможно сохранить в поле первичного ключа в конечной таблице или в поле, для которого свойству Индексировано присвоено значение Да (без повторов) в базе данных Access. Удалите повторяющиеся значения в исходном файле и повторите импорт.
Открыв таблицу в режиме таблицы, вы можете заметить, что некоторые поля пустые. Чтобы сократить количество пустых значений в таблице или полностью удалить их, выполните перечисленные ниже действия.
- Если в первых 25 строках исходного файла встречаются значения с разным типом данных, откройте файл и поменяйте порядок строк таким образом, чтобы в каждом поле в первых 25 строках тип данных совпадал. Затем попробуйте повторить импорт.
- Заключите в одинарные или двойные кавычки все нетекстовые значения, которые вы хотите сохранить как текстовые.
- В ходе импорта выберите для каждого поля подходящий тип данных. Если он указан неправильно, во всем столбце могут появиться пустые или неверные значения.
Кроме того, может потребоваться просмотреть таблицу ошибок, о которой говорится на последней странице мастера, в режиме таблицы. Эта таблица содержит три поля: «Ошибка», «Поле» и «Строка». В каждой ее строке содержатся сведения об определенной ошибке, а данные в поле «Ошибка» можно использовать при устранении проблем.
Полный список ошибок и советы по устранению неполадок
Значение в поле превышает размер, заданный свойством FieldSize этого поля.
Ошибка преобразования типа
Значение в текстовом файле или на листе не соответствует типу данных поля. Это значение может быть заменено пустым или неверным значением в конечном поле. Дополнительные сведения об устранении этой проблемы см. в предыдущей таблице.
Нарушение уникальности ключа
Значение первичного ключа записи совпадает со значением, уже имеющимся в таблице.
Нарушение условия на значение
Значение не соответствует правилу, заданному для этого поля или таблицы с помощью свойства ValidationRule.
Пустое значение в обязательном поле
Данное поле не может иметь пустое значение, поскольку его свойство Обязательное поле (Required) имеет значение Да.
Пустое значение в поле счетчика
Импортируемые данные содержат пустое значение (NULL), и была выполнена попытка добавить его в поле счетчика.
Текстовое значение содержит знак разделителя (как правило, это прямые кавычки). Если значение содержит знак разделителя, он должен содержаться в текстовом файле дважды, например:
по 10 дискет 3 1/2″» в коробке
Создание связи с текстовым файлом
Связывание позволяет использовать данные из другого файла, не импортируя их. В этом случае можно просматривать обновленные данные как в исходной программе, так и в файле Access. При этом не требуется создавать и обновлять копию данных в Access. Если вместо копирования текстового файла в базу данных Access требуется использовать его для выполнения запросов и создания отчетов, следует использовать не операцию импорта, а функцию связывания с текстовым файлом.
Когда вы создаете связь с текстовым файлом, Access создает таблицу, которая связана с исходным файлом. Все изменения, вносимые в исходный файл, применяются к связанной таблице. При этом изменение данных таблицы в Access не разрешается. Если вы хотите внести изменения в содержимое или структуру, откройте исходный файл и отредактируйте его.
Стандартные сценарии связывания с текстовым файлом из Access
- Вы используете программу, которая сохраняет выходные данные в текстовом формате, однако эти данные нужны для анализа и создания отчетов в других приложениях, в том числе в Access.
- Данные, необходимые для работы, обновляются сотрудниками другого отдела или рабочей группы. Вы хотите просматривать обновленные данные, но не изменять их или хранить собственную копию.
Первое связывание с текстовым файлом
- При связывании с текстовым файлом в Access создается новая таблица, которая называется также связанной таблицей. В ней отображаются данные исходного файла; при этом они не сохраняются в базе данных.
- Текстовый файл невозможно связать с существующей таблицей базы данных. Другими словами, операция связывания не позволяет добавлять данные в существующую таблицу.
- База данных может содержать несколько связанных таблиц.
- Все изменения данных в исходном файле автоматически отражаются в связанной таблице. Однако содержимое и структура связанной таблицы Access доступны только для чтения.
- При открытии текстового файла в Access создается пустая база данных и автоматически запускается мастер связывания с текстовыми файлами.
Шаги по созданию связи с текстовым файлом
- Найдите текстовый файл и откройте его в текстовом редакторе, например, в Word или Блокноте. Имейте в виду, что в ходе одной операции связывания можно создать связь лишь с одним текстовым файлом. Чтобы создать связь с несколькими текстовыми файлами, операцию следует повторить для каждого из них.
- Просмотрите данные исходного файла и выполните необходимые действия в соответствии с приведенной ниже таблицей.
- Разделитель является частью значения поля. Например, если в качестве разделителя используется запятая, а значение поля равно Самара, Вологда, его придется заключить в ограничители: «Самара, Вологда».
- Вы хотите, чтобы Access обрабатывал нетекстовые значения, например 0452934 и 0034539, как текстовые и хранил их в текстовом поле.
Во время связывания можно указать, используется ли в файле ограничитель, и, если он используется, задать соответствующий знак.
Убедитесь в том, что во всем файле используется один ограничитель текста и что он применяется только к текстовым значениям.
Число исходных полей не должно превышать 255 , так как Access поддерживает не более 255 полей в таблице.
Пропуск записей и полей
Вы можете пропустить некоторые поля, но не записи.
Пустые строки и поля
Удалите все лишние пустые строки в файле. При наличии пустых полей постарайтесь добавить в них отсутствующие данные в исходном файле.
Найдите и удалите лишние знаки (символы табуляции, перевода строки, возврата каретки).
Чтобы избежать ошибок при связывании, убедитесь, что типы данных в полях одинаковы для всех строк. Access считывает первые 25 строк файла, чтобы определить тип данных для полей таблицы. Настоятельно рекомендуем убедиться в том, что первые 25 исходных строк не содержат данные разных типов. Кроме того, нетекстовые значения, которые требуется обрабатывать как текстовые, необходимо заключить в одинарные или двойные кавычки.
Если исходный файл содержит смешанные значения в строках, идущих после 25-й строки, они могут быть неправильно преобразованы или привести к ошибкам. Сведения об устранении проблем см. в разделе Решение проблем со значением #ЧИСЛО! и неверными значениями в связанной таблицедалее в этой статье.
Если файл с разделителями не содержит имена полей, их рекомендуется указать в первой строке. В ходе связывания можно настроить мастер так, чтобы значения в первой строке считались именами полей. Однако при импорте файлов с полями фиксированного размера такая возможность недоступна.

- Закройте исходный файл, если он открыт.
- Откройте базу данных, в которой требуется создать связь. Убедитесь, что база данных доступна не только для чтения и что у вас есть права на внесение в нее изменений. Если ни одна из существующих баз данных не подходит для хранения связи, создайте пустую базу данных.
- Расположение мастера импорта или связывания текста зависит от используемой версии Access. Выполните действия, которые соответствуют вашей версии Access.
- Если вы используете Access 2019 или последнюю версию Access, которая предоставляется по подписке на Microsoft 365, на вкладке Внешние данные в группе Импорт и связи нажмите кнопку Создать источник данных и выберите Из файла >Текстовый файл.
- Если вы используете Access 2016, Access 2013 или Access 2010, на вкладке Внешние данные в группе Импорт и связи нажмите кнопку Текстовый файл.
- Откроется диалоговое окно Внешние данные — Текстовый файл.
- В диалоговом окне Внешние данные — Текстовый файл укажите имя текстового файла, который содержит данные для связывания, в поле Имя файла.
- Выберите вариант Создать связанную таблицу для связи с источником данных и нажмите кнопку ОК. Откроется мастер связывания с текстовыми файлами, помогающий выполнить нужные действия по связыванию.
- Access проверит содержимое файла и предложит его структуру. Если в файле используется разделитель, убедитесь, что выбран вариант с разделителями. Если файл содержит поля фиксированного размера, убедитесь, что выбран параметр фиксированная ширина полей.
- Нажмите кнопку Далее.
- Следующая страница зависит от выбранного варианта (файл с разделителями или полями фиксированного размера). Файлы с разделителями. Выберите или укажите знак разделителя для значений полей. Если в файле используется ограничитель строк, выберите в поле Ограничитель текста значение « (двойные кавычки) или ‘ (одинарные кавычки). Если первая строка исходного файла содержит имена полей, установите флажок Первая строка содержит имена полей. Затем нажмите кнопку Далее. Файлы с полями фиксированного размера. Мастер отображает содержимое файла. Если Access обнаруживает столбцы данных, для разделения полей вставляются вертикальные черты. Просмотрите предлагаемую мастером структуру и следуйте его инструкциям, если нужно добавить, удалить или исправить строки. Затем нажмите кнопку Далее.
- На следующей странице мастера выводятся свойства поля. Щелкните столбец в нижней части страницы, чтобы отобразить свойства нужного полей. Просмотрите и измените имена и типы данных конечных полей. Access проверяет первые 25 строк каждого столбца, чтобы определить тип данных для соответствующего поля. Если первые 25 строк столбца содержат значения разных типов, например текст и числа, мастер предлагает тип данных, совместимый со всеми значениями столбца или их большинством (как правило, это текстовый тип данных). Хотя можно выбрать и другой тип данных, следует помнить, что значения, несовместимые с этим типом, будут преобразованы неправильно или приведут к ошибкам. Дополнительные сведения см. ниже в разделе Решение проблем со значением #ЧИСЛО! и неверными значениями в связанной таблице. Для чего предназначена кнопка Дополнительно? Кнопка Дополнительно в мастере служит для создания или открытия спецификаций связывания в формате, который использовался в предыдущих версиях Access. В Access не поддерживается сохранение спецификации для связывания (в отличие от импорта и экспорта). Поэтому для сохранения спецификации связывания следует нажать кнопку Дополнительно, выбрать нужные параметры и нажать кнопку Сохранить как.
- Нажмите кнопку Далее.
- На последней странице мастера укажите имя связанной таблицы и нажмите кнопку Готово. Если таблица с указанным именем существует, появится запрос на ее перезапись. Нажмите кнопку Да, чтобы перезаписать файл, или кнопку Нет, чтобы задать другое имя таблицы. Access попытается создать связанную таблицу. В случае успешного создания таблицы появится сообщение Завершено связывание таблицы. Откройте связанную таблицу и просмотрите поля и данные, чтобы убедиться в их правильности.
- Заключите в одинарные или двойные кавычки все нетекстовые значения, которые вы хотите сохранить как текстовые.
- В ходе связывания выберите подходящий тип данных для каждого поля. Если выбран неверный тип данных, конечный столбец может содержать только значения #ЧИСЛО! во всех строках.
Решение проблем со значением #ЧИСЛО! и неверными значениями в связанной таблице
Даже если появится сообщение Завершено связывание таблицы, откройте таблицу в режиме таблицы и убедитесь, что все строки и столбцы содержат правильные данные.
При наличии в таблице ошибок или неверных данных необходимо выполнить действия, описанные в приведенной ниже таблице, и повторить попытку связывания. Следует помнить, что добавить значения непосредственно в связанную таблицу невозможно, так как она доступна только для чтения.
Значения –1 или 0
Если в исходном файле есть поле, которое содержит только значения «Истина» или «Ложь» либо только значения «Да» или «Нет», и для этого поля выбран тип данных Логический, в таблице появятся значения –1 и 0. Откройте таблицу в режиме конструктора и задайте для свойства Формат значение Истина/Ложь или Да/Нет.
При связывании в одном поле не может быть несколько значений. Список значений обрабатывается как одно значение и помещается в тестовое поле. Значения в поле разделяются точкой с запятой.
В случае усечения данных в столбце попытайтесь увеличить его ширину в режиме таблицы. Если устранить проблему таким образом не удается, возможно, причина в том, что числовое поле имеет тип «Длинное целое» вместо «Двойное с плавающей точкой».
Открыв таблицу в режиме таблицы, вы можете заметить, что некоторые поля содержат значение #ЧИСЛО! вместо фактического значения. Чтобы свести к минимуму количество значений NULL в таблице или избавиться от них совсем, выполните следующие действия:
В приведенной ниже таблице содержится список случаев, в которых будут появляться ошибки #ЧИСЛО!.
Тип отсутствующих значений
Тип конечного поля
Числовое поле или поле даты
Замените все текстовые данные значениями, соответствующими типу данных конечного поля, и повторите попытку связывания.
Замените все значения даты числовыми значениями и повторите попытку связывания.
Замените все числовые значения значениями даты и повторите попытку связывания.
Файл открыт в режиме дополнения какая строка кода верна
Ну, учимся работать с текстовыми файлами. Это даст нам возможность прочитать существующий файл, изменить его, или создать свой, не прибегая к текстовым редакторам. Кроме того, в текстовом файле удобно хранить служебные данные собственной программы, например установки пользователя, результаты обработки данных и т.п.
Текстовой файл, собственно по названию, содержит в себе текстовые символы, ну и символы типа возврат каретки или перевод строки. Традиционно они имеют расширение .txt для текста, .dat для данных, .bat для исполняемых (командных) файлов, ну Windows еще использует .ini, .log, .inf. Читать и записывать их надо последовательно, символ за символом, начиная с первого.
Итак, чтобы что-нибудь сделать с файлом, прежде всего, его надо открыть.
При открытии файла для последовательного доступа нельзя считать какой-то один, к примеру, знак из середины файла, для этого есть другие способы доступа, но об этом не сегодня.
Для открытия файла используется оператор Open. Синтаксис его такой:
Open путь For режим As #номер файла
Примечание: для открытия файлов прямого доступа, или двоичных файлов оператор Open содержит еще кое-какие аргументы, но сейчас мы их не используем и опускаем.
Все указанные аргументы должны обязательно присутствовать:
путь — это полный путь к открываемому файлу — (строковое выражение) пишется в кавычках, может состоять из нескольких строк, соединенных знаком конкатенации &. (Например «c:\MyText\referat.txt» или «c:\Mytext\» & «referat.txt»)
режим — способ открытия файла и представляет собой ключевые слова. В этой главе му будем использовать Input для считывания данных из файла, Output — для записи данных в файл, и Append — для добавления данных в файл. В режиме Input можно еще раз открыть уже открытый файл под другим номером, не закрывая его, в режимах Output и Append надо сначала закрыть файл, а потом открыть его снова.
#номер файла — это всего лишь номер, по которому VB индентефицирает открытый файл. Он может быть любой от #1 до #255. Однако, лучше всего использовать функцию FreeFile (см. в примере), которая сразу возвратит свободный номер в переменную, и тебе нет нужды искать по своему коду, открыт ли у тебя файл под номером, например #3.
Кстати сказать, после того, как передача или прием данных в (из) файл(а) будут закончены, его надо закрыть, делается это оператором Close. Если этот оператор написать без всяких аргументов, он закроет все открытые файлы. Если же нам надо закрыть файл, скажем номер 2, то пишем Close #2. Попробуем работать с файлами на примерах:
| СЧИТЫВАНИЕ из текстового файла. |
Создадим новый .exe проект в какой-нибудь папке и в ту же папку положим небольшой текстовой файл (у меня например «Справка.txt»). На форме разместим кнопку Command1 и текстовое поле Text1. В свойствах Text1 свойство Multiline поставим в True (чтобы текст переносился по строкам), а свойство ScrollBars в 2 — Вертикаль (чтобы можно было прокручивать текст, если он не уместился) смотри рис.15.

Рисунок 15.
Откроем окно кода и в (Genarel) объявим переменные F для хранения номера свободного файла, MyText и AllMyText — для хранения считываемого текста:
Dim F As Long
Dim MyText As String
Dim AllMyText As String
Создадим прцедуру Command1_Click() (щелкнув мышью по Command1 в выпадающем списке в окне кодов в верхнем левом поле, там где (General)). В теле образовавщейся процедуры. Можно также щелкнуть два раза по кнопке Command1 в режиме Объект и перейти в режим Код — там появится нужная нам процедура.
Private Sub Command1_Click()
Напишем для определения номера свободного файла
F = FreeFile
и откроем файл для чтения
Open App.Path & «\Справка.txt» For Input As #F
Обратите внимание, что для указания пути файла мы опять используем функцию App.Path. Если бы мы написали просто «c:\VB\example\Справка.txt», то при переносе нашей паки с программой на другой диск или компьютер этот путь оказался бы ложным. А функция App.Path всегда возвращает путь, где лежит наша программа. Только перед именем файла не забывайте ставить обратный слеж (\), иначе запись работать не будет.
Для считывания строки текста существует оператор Line Input. Попробуем считать с его помощью содержимое файла в переменную MyText :
Line Input #F, MyText
Передадим значение MyText переменной в Text1, чтобы увидеть, что мы там считали:
Text1.Text = MyText
затем закроем файл
Close #F
End Sub
и запустим нашу программу. Когда мы нажмем кнопку Command1, то в Text1 появиться содержимое файла «Справка.txt». Проблема только в том, что, если,( как и случилось в нашем файле «Справка.txt»), при создании текста применялось нажатие кнопки ENTER (перевод строки), то оператор Line Input считает текст до этого знака и все, потому, что строка кончилась. Чтобы этого избежать, мы применим цикл и будем считывать строки до конца файла. Для этого придется разобраться с новым для нас циклом по условию Do. Loop.
| Цикл по условию Do. Loop. |
Это очень простая вещь. Цикл работает до тех пор, пока не выполнится какое-нибудь условие. Например мы будем увеличивать переменную X до тех пор, пока оне не станет равной, например, 100. Для этого применяется аргумент Until:
Do Until x>=100
x=x+1
Loop
при этом когда цикл закончится x будет равно 100. Можно записать его по другому, при этом смысл работы цикла не изменится:
Do
x = x + 1
Loop Until x >=100
Можно цикл записать наоборот, и он будеn выполняться до тех пор, пока соблюдается какое-то условие. Для этого применяется аргумент While (делать, пока. ) :
Do While x < 100
x = x + 1
Loop
Do
x = x + 1
Loop While x < 100
Во всех четырех случаях результат будет один. Цикл остановится, когда X=100. Только надо обращаться с ними аккуратно. Если ты поставишь условие, которое изначально ложно, цикл не выполнится ни разу, и наоборот если условие будет истинно всегда, возникнет бесконечный цикл и программа по-сути зависнет. Вот этот цикл не будет выполняться:
Do While x =100
x = x + 1
Loop
а этот будет бесконечным
Do Until x < 0
x = x + 1
Loop
Ну а теперь используем наш цикл для считывания строк из файла до тех пор, пока не настанет конец файла. Чтобы узнать, достигнут ли конец файла, можно использовать функцию EOF(номер файла), которая примет значение True, как только конец файла будет достигнут. Теперь переделаем нашу процедуру следующим образом:
Private Sub Command1_Click() ‘1
Text1.Text = «» ‘2
F = FreeFile ‘3
Open App.Path & «\Справка.txt» For Input As #F ‘4
Do Until EOF(F) ‘5
Line Input #F, MyText ‘6
Text1.Text = Text1.Text & MyText & vbCrLf ‘7
Loop ‘8
Close #F ‘9
End Sub ’10
По строкам здесь:
1 — объявление нашей процедуры
2 — очистка Text1
3 — присваиваем переменной F свободный номер файла
4 — открываем файл «Справка.txt» для последовательного чтения
5 — цикл по условию: до тех пор пока не конец файла
6 — DO в цикле считываем каждую строчку
7 — Присоединяем очередную строку к Text1 и ставим перевод строки (vbCrLf) чтоб красиво было
8 — LOOP завершаем цикл
9 — закрываем наш файл
10- конец процедуры
Ну вот и готово.
Сейчас мы считаем файл другим способом, с помощью функции Input. Синтаксис ее такой:
Input(число, [#]номерФайла)
Смысл ее такой, что она из файла [#]номерФайла, открытого в режиме Input считывает число знаков. Мы используем ее также, как оператор Line Input, только считывать будем не по одной строчке, а по одному символу, и собирать их будем в переменной AllMyText, значение которой присвоим потом текстбоксу Text1. Поместим на нашу форму еще одну кнопку Command2 (свойство Caption присвоим «Функция Input») и создадим для нее прцедуру, где и используем функцию Input.
Private Sub Command2_Click()
F = FreeFile
Open App.Path & «\Справка.txt» For Input As #F
Do Until EOF(F)
MyText = Input(1, #F)
AllMyText = AllMyText & MyText
Loop
Close #F
Text1.Text = AllMyText
End Sub
Здесь все почти в точности, как и в предыдущем примере, только суть несколько другая.
Ну и в дополнение попробуем прочитать наш файл с помощью оператора Input #. Это не самая лучшая идея, так как эта инструкция считывает файл, желательно, записанный с оператора Write #. Синтаксис такой:
Input #номерФайла, списокПеременных
а смысл в том, что она из последовательно открытого в режиме Input файла с номером #номерФайла считывает в переменные списокПеременных данные, разделенные запятыми. Этот оператор для считывания обычных текстов не годится, а вот данных, а потом использование их в переменных — сколько угодно. Но мы попробуем считать все-таки этот наш файл и этим оператором.
Опять кладем на форму кнопку Command3 и там ваяем по тому же принципу:
Private Sub Command3_Click()
F = FreeFile
Open App.Path & «\Справка.txt» For Input As #F
Do Until EOF(F)
Input #F, MyText
AllMyText = AllMyText & «, » & MyText
Loop
Close #F
Text1.Text = AllMyText
End Sub
Это, конечно, некорректное применение оператора, но мы вернемся к нему, когда будем рассматривать запись в файл с помощью оператора Write #. Как ты видишь, запятые не выводятся, приходится их запихивать насильно, не всегда к месту, но ради полноты, я посчитал надо показать и это. Все, теперь запись.
| ЗАПИСЬ в текстовой файл. |
Как и для считывания, прежде, чем записывать в текстовой файл, нужно получить к нему доступ. Для этого используем оператор Open с ключевым словом Output.
Добавим на форму еще кнопку Command4. Создадим для нее процедуру и напишем там:
Private Sub Command4_Click()
F = FreeFile
Open App.Path & «\Запись.txt» For Output As #F
Таким образом мы открыли файл с последовательным доступом, который называется «Запись.txt» в нашей текущей директории под свободным номером #F, для записи (For Output). При этом, если такого файла не существует, он будет создан, а если существует и в нем что-то записано, то это что-то будет стерто, а вместо будет помещены наши новые данные, которые мы сейчас будем записывать, например, скажем с помощью оператора Print #. Записать его можно аналогично оператору считывания Line Input:
Print #F, Text1.Text
То есть, мы записываем содержимое нашего текстбокса (если там что-то есть. Считайте в текстбокс Text1 наш файл Справка.txt нажатием одной из кнопок Command1-Command3) в файл «Запись.txt». Затем закрываем файл и конец процедуре:
Close #F
End Sub
Ты можешь открыть этот файл с помощью Виндусового Блокнота или в любом текстовом редакторе и посмотреть его. Или напиши в нашей программе свой код, чтоб считать этот файл в Text1 и сразу его посмотреть.
В принципе, если тебе это надо, оператор Print # может форматировать текст, т.е. менять отступы от края, вставлять пробелы, но только между переменными, а не конечно в середину, скажем, нашего текста. Для этого используется аргументы Spc (количество пробелов) для введения пробелов и Tab(номер столбца) для вывода данных по столбцам. Положим на форму еще текстбокс Text2 и кнопку Command5 и в ее процедуре напишем код для форматированной записи. Потом считаем наши записи в Text2 с помощью оператора Line Input. С этим, я думаю, ты разберешся сам. (Не забудь поставить свойства Text2:свойство Multiline поставим в True, а свойство ScrollBars в 2 — Вертикаль.
Private Sub Command5_Click()
F = FreeFile
Open App.Path & «\Запись.txt» For Output As #F
‘печатаем тексты с 15-й позиции
Print #F, Spc( 15 ) ; «Я вывожу этот текст»
Print #F, Spc( 15 ) ; «очень красиво»
Print #F, Spc( 15 ) ; «потому, что я настоящий»
Print #F, Spc( 15 ) ; «ПРОГРАММИСТ»
‘печатаем пустую строку
Print #F,
‘печатаем тексты в 30-ем, 40-м и 50-м стобцах соответственно
Print #F, Tab( 30 ) ; «тридцатый столбец»
Print #F, Tab( 40 ) ; «сороковой столбец»
Print #F, Tab( 50 ) ; «пятидесятый столбец»
‘если оператор завершать точкой с запятой, то перехода на следующую строку не будет
Print #F, Spc( 15 ) ; «Печатаю текст»;
Print #F, Spc( 15 ) ; «не очень хорошо»
‘ и наконец несколько текстов в одном операторе
Print #F, Spc( 10 ) ; «10 пробелов»; Tab( 30 ) ; «30-й столбец+ 10 пробелов в начале»; Spc( 5 ) ; «Пять пробелов»
Close #F
‘считаем записанный текст в Text2
Text2.Text = «»
MyText = «»
F = FreeFile
Open App.Path & «\Запись.txt» For Input As #F
Do Until EOF(F)
Line Input #F, MyText
Text2.Text = Text2.Text & MyText & vbCrLf
Loop
Close #F
End Sub
Теперь запишем чего-нибудь в файл с помощью оператора Write #, а потом, уже корректно считаем это оператором Input # о котором мы уже говорили в этой главе. С помощью оператора Write # удобно записывать данные твоей программы. Есть две особенности. Первое — данные разделяются разделителем (запятой), и второе — данные надо считывать в переменные того же типа, что и запись в файле ( то есть число — в число, дату в дату, стоку в строку и т.п., иначе возникнет ошибка) и представляются они в файле в достаточно своеобразном виде — каждый в своем формате. Сейчас разберем это на примере, я так думаю, будет понятнее. Положим еще одну кнопку Command6 на форму и в ней объявим переменные четырех разных типов.
Private Sub Command6_Click()
Dim Chislo As Long ‘ числовая
Dim Stroka As String ‘ строковая
Dim Logika As Boolean ‘ логическая
Dim DDate As Date ‘ дата (не путайте с Data)
Надо заметить, что число выводится в файл как число, строка — как строка в кавычках, логическая переменная может принимать только два значения Да и Нет в формате #False# или #True#, а дата в виде #2004-07-20# , что соответствует 20 июля 2004 года. Дальше присваиваем переменным какие-нибудь значения в соответствующем формате
Chislo = 15
Stroka = «пятнадцать»
Logika = True
DDate = #7/20/2004#
Записываем данные в файл.
Обратите внимание , я нарочно записываю двумя операторами Write #, а считываю одним, чтобы показать, что абсолютно не имеет значения, сколько операторов Write# или Input# ты будешь использовать.
‘ теперь считаем данные с помощью оператора Input#
F = FreeFile
Open App.Path & «\Запись.txt» For Input As #F
Input #F, Chislo, Stroka, Logika, DDate
‘и выведем их в Text2
Text2.Text = Chislo & » » & Stroka & » » & Logika & » » & DDate
Close #F
End Sub
Сейчас, когда ты запустишь программу, ты увидишь, что в Text2 данные вывелись в очень достойном виде, но это потому, что мы используем для считывания оператор Input #. Если же ты откроешь файл » Запись» в блокноте или считаешь файл с помощью оператора Line Input, то увидишь несколько иную картину, вот такую:
Поэтому делать текстовые файлы для чтения их в других приложения бессмысленно. Но использовать операторы Write# — Input# внутри программы для работы с собстенными данными очень удобно.
| Добавление данных в текстовой файл. |
Чтобы добавить новые данные в текстовой файл и при этом не стирать имеющихся там, надо просто открыть файл с ключевым словом Append. Новые данные будут записываться в конец файла. Быстренько разберем это на примере. Для этого положим на форму последнюю кнопку Command7 и в ней напишем код:
Private Sub Command7_Click()
Text2.Text = «»
MyText = «»
F = FreeFile
‘открываем файл для дабавления
Open App.Path & «\Запись.txt» For Append As #F
Print #F, Spc( 15 ) ; «Я добавляю этот текст снова и снова»
Close #F
‘считаем записанный текст в Text2
F = FreeFile
Open App.Path & «\Запись.txt» For Input As #F
Do Until EOF(F)
Line Input #F, MyText
Text2.Text = Text2.Text & MyText & vbCrLf
Loop
Close #F
End Sub
Ну вот и все, что я хотел сообщить тебе сегодня про текстовые файлы. Ну нам с файлами еще работать и работать. . Исходник можешь скачать вверху страницы.
Функция open() в Python, открывает файл на чтение/запись
Открывает файл для чтения или записи файлового потока
Синтаксис:
fp = open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
Параметры:
- file — абсолютное или относительное значение пути к файлу или файловый дескриптор открываемого файла.
- mode — необязательно, строка, которая указывает режим, в котором открывается файл. По умолчанию ‘r’ .
- buffering — необязательно, целое число, используемое для установки политики буферизации.
- encoding — необязательно, кодировка, используемая для декодирования или кодирования файла.
- errors — необязательно, строка, которая указывает, как должны обрабатываться ошибки кодирования и декодирования. Не используется в -бинарном режиме
- newline — необязательно, режим перевода строк. Варианты: None , ‘\n’ , ‘\r’ и ‘\r\n’ . Следует использовать только для текстовых файлов.
- closefd — необязательно, bool , флаг закрытия файлового дескриптора.
- opener — необязательно, пользовательский объект, возвращающий открытый дескриптор файла.
Возвращаемое значение:
Описание:
Функция open() открывает файл для чтения или записи при помощи файлового потока. Если файл не может быть открыт, бросается исключение OSError .
Функция возвращает файловый объект, который имеет методы, позволяющие читать и записывать информацию различными способами.
Аргумент file — это строка, определяющая абсолютное или относительное расположение открываемого файла в файловой системе или целочисленный файловый дескриптор файла. Если задан файловый дескриптор, он закрывается, когда возвращаемый файловый поток закрывается, если для closefd не установлено значение False .
Изменено в Python 3.6: В аргумент file добавлена поддержка приема объектов, реализующих os.PathLike . Обратите внимание, что модуль pathlib реализует протокол os.PathLike .
Аргумент mode — это необязательная строка, которая указывает режим, в котором открывается файл. По умолчанию ‘r’ , это означает, что файл открыт для чтения в текстовом режиме. Другими распространенными значениями являются ‘w’ для записи (очищает файл, если он уже существует), ‘x’ для монопольного создания и ‘a’ для добавления (что в некоторых системах Unix означает, что все операции записи добавляются в конец файла) независимо от текущей позиции указателя файла). В текстовом режиме, если кодировка не указана, используемая кодировка зависит от платформы: вызывается locale.getencoding() для получения текущей кодировки локали. (Для чтения и записи необработанных байтов нужно использовать двоичный режим и оставить кодировку неуказанной.) Доступны следующие режимы:
Значения аргумента mode :
- r — открывает файл только для чтения,
- w — открыт для записи (перед записью файл будет очищен),
- x — эксклюзивное создание, бросается исключение FileExistsError , если файл уже существует.
- a — открыт для добавления в конец файла (на некоторых Unix-системах пишет в конец файла вне зависимости от позиции курсора)
- + — символ обновления (чтение + запись).
- t — символ текстового режима.
- b — символ двоичного режима (для операционных систем, которые различают текстовые и двоичные файлы).
Режим по умолчанию ‘r’ , открывает файл только для чтения текста, синоним ‘rt’ . Режимы ‘r+’ и ‘r+b’ открывают файл и устанавливают курсор на начало файла, запись в файл начинается с места остановки курсора при его чтении перед записью. Если файл перед записью не читался то запись осуществляется в начало файла. Режимы ‘w’ и ‘wb’ создают новый файл или открывают существующий файл только для записи, с последующей его очисткой (стирает все перед записью). У режимов ‘w+’ и ‘wb+’ поведение такое же как в предыдущем случае, только если не закрывать файл после записи, его еще можно потом прочитать.
Варианты использования режимов:
- ‘r’ — Открывает файл только для чтения. Указатель файла помещается в начале файла. Это режим «по умолчанию».
- ‘rb’ — Открывает файл в бинарном режиме только для чтения. Указатель файла помещается в начале файла. Это режим «по умолчанию».
- ‘r+’ — Открывает файл для чтения и записи. Указатель файла помещается в начало файла.
- ‘rb+’ — Открывает файл в бинарном режиме для чтения и записи. Указатель файла помещается в начале файла. Это режим «по умолчанию».
- ‘w’ — Открывает файл только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.
- ‘wb’ — Открывает файл в бинарном режиме только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.
- ‘w+’ — Открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создается новый файл для чтения и записи.
- ‘wb+’ — Открывает файл в бинарном режиме для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создается новый файл для чтения и записи.
- ‘a’ — Открывает файл для добавления. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
- ‘ab’ — Открывает файл в бинарном режиме для добавления. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
- ‘a+’ — Открывает файл для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
- ‘ab+’ — Открывает файл в бинарном режиме для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
Python различает двоичный и текстовый ввод/вывод. Файлы, открытые в двоичном режиме, возвращают содержимое в виде bytes объектов без какого-либо декодирования. В текстовом режиме (по умолчанию или когда ‘t’ включен в аргумент mode ) содержимое файла возвращается как строка байтов, которые были сначала декодированы с использованием кодировки, используемой системой по умолчанию или с использованием переданного аргумента encoding .
Аргумент buffering — необязательное целое число, используемое для установки политики буферизации.
- 0 — отключить буферизацию, только для бинарного режима;
- 1 — построчная буферизация, только для текстового режима;
- int число > 1 — размер буфера в байтах.
- -1 — по умолчанию.
У текстовых файлов, если buffering не задан, используется построчная буферизаця. Двоичные файлы буферизируются кусками фиксированного размера. Этот размер определяется эвристикой, пытающейся определить размер блока устройства, на котором находится файл, в случае неудачи использует io.DEFAULT_BUFFER_SIZE . Для многих систем буфер равен 4096 или 8192 байт.
Аргумент encoding — это имя кодировки, используемой для декодирования или кодирования файла. Это аргумент следует использовать только в текстовом режиме. Кодировка по умолчанию зависит от платформы, но может использоваться любая кодировка текста, поддерживаемая Python.
Аргумент error является необязательным и указывает как должны обрабатываться ошибки кодирования и декодирования. Следует использовать только для текстовых файлов.
Доступны стандартные обработчики ошибок:
- ‘strict’ — бросает исключение ValueError , если есть ошибка кодирования. Значение по умолчанию None имеет тот же эффект.
- ‘ignore’ — игнорирует ошибки. Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.
- ‘replace’ — вставляет символ ? на место непрочитанных символов, ввиду их отсутствия в используемой кодировке.
- ‘surrogateescape’ — любые некорректные байты будут представлены как символы Юникода в диапазоне от U+DC80 до U+DCFF . Эти символы, при обратной операции кодирования будут возвращаться в те же байты. Полезно для обработки файлов в неизвестной кодировке.
- ‘xmlcharrefreplace’ — поддерживается только при записи в файл. Символы, не поддерживаемые кодировкой, заменяются соответствующей ссылкой на символ XML.
- ‘backslashreplace’ — заменяет искаженные данные на escape-последовательности Python с обратной косой чертой.
- ‘namereplace’ — поддерживается только при записи, заменяет не поддерживаемые символы на \N escape-последовательности.
Аргумент newline контролирует работу режима новой строки. Работает только с текстовым режимом. Допустимые аргументы: None , » , ‘\n’ , ‘\r’ и ‘\r\n’ .
Это работает следующим образом:
- Чтение файла:
- если аргумент newline=None или не указан, то символами окончания строк ‘\n’ , ‘\r’ или ‘\r\n’ на выходе преобразуются в разделитель строки ‘\n’ .
- если newline=» , то получим результат с вырезанными символами окончания строк ‘\n’ , ‘\r’ или ‘\r\n’ , то есть файл прочитается как одна большая строка.
- если newline=’\n’ , то в результате чтения функция open() уберет только символ \n из результата, если newline=’\r’ , то только \r , если newline=’\r\n’ , то только сочетание ‘\r\n’ не будет учитываться.
- если аргумент newline=None или не указан, то символы окончания строк \n будут переведены в разделители строк, которые система использует по умолчанию;
- если newline=» или newline=’\n’ , то символы окончания строк \n переводится в разделители строк не будут. В файл запишется одна большая строка.
- если newline=’\r’ , то в результате записи функция open() сохранит значение \r в качестве разделителя строк, если newline=’\r\n’ , то запишется сочетание ‘\r\n’ .
Аргумент closefd по умолчанию True . Если аргумент closefd=False и вместо имени файла был задан его дескриптор, то при закрытии файла функцией open() , базовый дескриптор файла будет оставаться открытым. Если задано имя файла, closefd должно быть True (по умолчанию), иначе возникнет ошибка.
Необязательный аргумент opener (по умолчанию None ), пользовательский объект поддерживающий вызов, который следует использовать для открытия файла. Этот объект получая на входе file и flags , должен возвращать открытый дескриптор файла.
Дополнительно смотрите функцию os.open() , которая открывает файл и возвращает его файловый дескриптор. Вновь созданный дескриптор не наследуется .
В следующем примере используется параметр dir_fd функции os.open() , чтобы открыть файл относительно данного каталога:
>>> import os >>> dir_fd = os.open('/some/dir', os.O_RDONLY) >>> def opener(path, flags): . return os.open(path, flags, dir_fd=dir_fd) . >>> with open('test.txt', 'w', opener=opener) as f: . print('This will be written to /some/dir/test.txt', file=f) . >>> os.close(dir_fd) # не забывайте закрыть файловый дескриптор
Тип файлового объекта, возвращаемого функцией open() , зависит от режима. Когда используется open() , чтобы открыть файл в текстовом режиме ‘w’ , ‘r’ , ‘wt’ , ‘rt’ и т. д., она возвращает подкласс io.TextIOBase , в частности io.TextIOWrapper . При использовании для открытия файла в двоичном режиме с буферизацией возвращаемый класс является подклассом io.BufferedIOBase .
Итоговый класс меняется в зависимости от операции:
- в режиме чтения двоичных файлов он возвращает io.BufferedReader ;
- в двоичном режиме записи и в двоичном режиме добавления он возвращает io.BufferedWriter ;
- в режиме чтения/записи — io.BufferedRandom .
Когда отключена буферизация, исходный поток возвращает подклассы io.RawIOBase , io.FileIO .
Примеры чтения из файла и записи в файл.
Чтение и вывод на печать сразу всего файла:
f = open('demofile.txt', 'r') print(f.read()) f.close() # не забывайте закрыть файл
Чтение всего файла и вывод на печать построчно:
f = open('demofile.txt', 'r') for line in f: print(line) f.close() # не забывайте закрыть файл
Создадим файл newfile.txt и запишем в него строку. Если файл с таким именем уже существует, то данные внутри файла сотрутся.
f = open('newfile.txt', 'w') f.write('Это единственная строка в файле\n') f.close() # не забывайте закрыть файл
Использование менеджера контекста для чтения/записи в файл.
Открываем файл на запись с помощью менеджера контекста и пишем данные в конец файла.
with open('demofile.txt', 'a') as f: f.write('Привет Мир\n') # здесь закрывать файл не надо, менеджер контекста сделает это сам.
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Функция open. Чтение и запись текстовых файлов в Python
Большие объемы данных хранят не в списках или словарях, а в файлах и базах данных. В этом уроке изучим особенности работы с текстовыми файлами в Python. Такие файлы рассматриваются как содержащие символы и строки.
Бывают еще байтовые (бинарные) файлы, которые рассматриваются как потоки байтов. Побайтово считываются, например, файлы изображений. Работа с бинарными файлами несколько сложнее. Нередко их обрабатывают с помощью специальных модулей Python (pickle, struct).
Функция open
Связь с файлом на жестком диске выполняется с помощью встроенной в Python функции open() . Обычно ей передают один или два аргумента. Первый – имя файла или имя с адресом, если файл находится не в том каталоге, где находится сама программа. Второй аргумент – режим, в котором открывается файл.
Обычно используются режимы чтения ( ‘r’ ) и записи ( ‘w’ ). Если файл открыт в режиме чтения, то запись в него невозможна. Можно только считывать данные. Если файл открыт в режиме записи, то в него можно только записывать данные, считывать нельзя.
Если файл открывается в режиме ‘w’ , то все данные, которые в нем были до этого, стираются. Файл становится пустым. Если не надо удалять существующие в файле данные, тогда следует использовать вместо режима записи, режим дозаписи ( ‘a’ ).
Если файл отсутствует, то открытие его в режиме ‘w’ создаст новый файл. Бывают ситуации, когда надо гарантировано создать новый файл, избежав случайной перезаписи данных существующего. В этом случае вместо режима ‘w’ используется режим ‘x’ . В нем всегда создается новый файл для записи. Если указано имя существующего файла, то будет выброшено исключение. Потери данных в уже имеющемся файле не произойдет.
Если при вызове open() второй аргумент не указан, то файл открывается в режиме чтения как текстовый файл. Чтобы открыть файл как байтовый, дополнительно к букве режима чтения/записи добавляется символ ‘b’ . Буква ‘t’ обозначает текстовый файл. Поскольку это тип файла по умолчанию, то обычно ее не указывают.
Нельзя указывать только тип файла, то есть open(«имя_файла», ‘b’) есть ошибка, даже если файл открывается на чтение. Правильно – open(«имя_файла», ‘rb’) . Только текстовые файлы мы можем открыть командой open(«имя_файла») , потому что и ‘r’ и ‘t’ подразумеваются по-умолчанию.
Функция open() возвращает объект файлового типа. Его надо либо сразу связать с переменной, чтобы не потерять, либо сразу прочитать.
Чтение файла
С помощью файлового метода read() можно прочитать файл целиком или только определенное количество байт. Пусть у нас имеется файл data.txt с таким содержимым:
one - 1 - I two - 2 - II three - 3 - III four - 4 - IV five - 5 - V
Откроем его и почитаем:
>>> f1 = open(‘data.txt’) >>> f1.read(10) ‘one — 1 — ‘ >>> f1.read() ‘I\ntwo — 2 — II\nthree — 3 — III\nfour — 4 — IV\nfive — 5 — V\n’ >>> f1.read() » >>> type(f1.read())
Сначала считываются первые десять символов. Последующий вызов read() считывает весь оставшийся текст. После этого объект файлового типа f1 становится пустым.
Заметим, что метод read() возвращает строку, и что конец строки считывается как ‘\n’ .
Для того, чтобы читать файл построчно существует метод readline() :
>>> f1 = open('data.txt') >>> f1.readline() 'one - 1 - I\n' >>> f1.readline() 'two - 2 - II\n' >>> f1.readline() 'three - 3 — III\n'Метод readlines() считывает сразу все строки и создает список:
>>> f1 = open('data.txt') >>> f1.readlines() ['one - 1 - I\n', 'two - 2 - II\n', 'three - 3 - III\n', 'four - 4 - IV\n', 'five - 5 - V\n']Объект файлового типа относится к итераторам. Из таких объектов происходит последовательное извлечение элементов. Элементами в данном случае являются строки-линии файла. Поэтому считывать данные из файла можно сразу в цикле без использования методов чтения:
>>> for i in open('data.txt'): . print(i) . one - 1 - I two - 2 - II three - 3 - III four - 4 - IV five - 5 - V >>>Здесь выводятся лишние пустые строки, потому что функция print() преобразует ‘\n’ в переход на новую строку. К этому добавляет свой переход на новую строку. Создадим список строк файла без ‘\n’ :
>>> nums = [] >>> for i in open('data.txt'): . nums.append(i[:-1]) . >>> nums ['one - 1 - I', 'two - 2 - II', 'three - 3 - III', 'four - 4 - IV', 'five - 5 - V']Переменной i присваивается очередная строка файла. Мы берем ее срез от начала до последнего символа, не включая его. Следует иметь в виду, что ‘\n’ это один символ, а не два.
Запись в файл
Запись в файл выполняется с помощью методов write() и writelines() . Во второй можно передать структуру данных:
>>> l = ['tree', 'four'] >>> f2 = open('newdata.txt', 'w') >>> f2.write('one') 3 >>> f2.write(' two') 4 >>> f2.writelines(l)Метод write() возвращает количество записанных символов.
Закрытие файла
После того как работа с файлом закончена, важно не забывать его закрыть, чтобы освободить место в памяти. Делается это с помощью файлового метода close() . Свойство файлового объекта closed позволяет проверить закрыт ли файл.
>>> f1.close() >>> f1.closed True >>> f2.closed False
Если файл открывается в заголовке цикла ( for i in open(‘fname’) ), то видимо интерпретатор его закрывает при завершении работы цикла или через какое-то время.
Практическая работа
- Создайте файл data.txt по образцу урока. Напишите программу, которая открывает этот файл на чтение, построчно считывает из него данные и записывает строки в другой файл ( dataRu.txt ), заменяя английские числительные русскими, которые содержатся в списке ( [«один», «два», «три», «четыре», «пять»] ), определенном до открытия файлов.
- Создайте файл nums.txt , содержащий несколько чисел, записанных через пробел. Напишите программу, которая подсчитывает и выводит на экран общую сумму чисел, хранящихся в этом файле.
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование