Как открыть сохраненный документ только для чтения?
- Начните открытие документа любым известным способом.
- Отыщите нужный файл на компьютере и выделите его одним щелчком левой кнопки мыши.
- В окне «Открытие документа» раскройте меню кнопки «Открыть» (рис. 2.23).

Рис. 2.23. Окно «Открытие документа». Меню кнопки «Открыть»
[stextbox caption=»Примечание»]В документ можно вносить исправления и дополнения, но их нельзя будет сохранить в этом же документе. При попытке сохранения автоматически откроется окно с предложением задать другое имя или новое место сохранения документа.[/stextbox]
Открытие файла для чтения или записи
Функция CreateFile может создать новый файл или открыть существующий. Необходимо указать имя файла, инструкции по созданию и другие атрибуты. Когда приложение создает новый файл, операционная система добавляет его в указанный каталог.
Пример. Открытие файла для записи
В следующем примере используется CreateFile для создания нового файла и его открытия для записи и WriteFile для синхронной записи в файл простой строки.
Последующий вызов для открытия этого файла с помощью CreateFile будет завершаться ошибкой, пока дескриптор не будет закрыт.
#include #include #include #include void DisplayError(LPTSTR lpszFunction); int __cdecl _tmain(int argc, TCHAR *argv[]) < HANDLE hFile; char DataBuffer[] = "This is some test data to write to the file."; DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer); DWORD dwBytesWritten = 0; BOOL bErrorFlag = FALSE; printf("\n"); if( argc != 2 ) < printf("Usage Error:\tIncorrect number of arguments\n\n"); _tprintf(TEXT("%s \n"), argv[0]); return; > hFile = CreateFile(argv[1], // name of the write GENERIC_WRITE, // open for writing 0, // do not share NULL, // default security CREATE_NEW, // create new file only FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. template if (hFile == INVALID_HANDLE_VALUE) < DisplayError(TEXT("CreateFile")); _tprintf(TEXT("Terminal failure: Unable to open file \"%s\" for write.\n"), argv[1]); return; >_tprintf(TEXT("Writing %d bytes to %s.\n"), dwBytesToWrite, argv[1]); bErrorFlag = WriteFile( hFile, // open file handle DataBuffer, // start of data to write dwBytesToWrite, // number of bytes to write &dwBytesWritten, // number of bytes that were written NULL); // no overlapped structure if (FALSE == bErrorFlag) < DisplayError(TEXT("WriteFile")); printf("Terminal failure: Unable to write to file.\n"); >else < if (dwBytesWritten != dwBytesToWrite) < // This is an error because a synchronous write that results in // success (WriteFile returns TRUE) should write all data as // requested. This would not necessarily be the case for // asynchronous writes. printf("Error: dwBytesWritten != dwBytesToWrite\n"); >else < _tprintf(TEXT("Wrote %d bytes to %s successfully.\n"), dwBytesWritten, argv[1]); >> CloseHandle(hFile); > void DisplayError(LPTSTR lpszFunction) // Routine Description: // Retrieve and output the system error message for the last-error code < LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); lpDisplayBuf = (LPVOID)LocalAlloc( LMEM_ZEROINIT, ( lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) // account for format string * sizeof(TCHAR) ); if (FAILED( StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error code %d as follows:\n%s"), lpszFunction, dw, lpMsgBuf))) < printf("FATAL ERROR: Unable to output error code.\n"); >_tprintf(TEXT("ERROR: %s\n"), (LPCTSTR)lpDisplayBuf); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf);
Пример. Открытие файла для чтения
В следующем примере используется CreateFile , чтобы открыть существующий файл для чтения, и ReadFile для синхронного чтения до 80 символов из файла.
В этом случае CreateFile завершается успешно, только если указанный файл уже существует в текущем каталоге. Последующий вызов для открытия этого файла с помощью CreateFile будет выполнен успешно, если вызов использует один и тот же режим доступа и общего доступа.
Совет. Для тестирования этого примера можно использовать файл, созданный с помощью предыдущего примера WriteFile.
#include #include #include #include #define BUFFERSIZE 5 DWORD g_BytesTransferred = 0; void DisplayError(LPTSTR lpszFunction); VOID CALLBACK FileIOCompletionRoutine( __in DWORD dwErrorCode, __in DWORD dwNumberOfBytesTransfered, __in LPOVERLAPPED lpOverlapped ); VOID CALLBACK FileIOCompletionRoutine( __in DWORD dwErrorCode, __in DWORD dwNumberOfBytesTransfered, __in LPOVERLAPPED lpOverlapped ) < _tprintf(TEXT("Error code:\t%x\n"), dwErrorCode); _tprintf(TEXT("Number of bytes:\t%x\n"), dwNumberOfBytesTransfered); g_BytesTransferred = dwNumberOfBytesTransfered; >// // Note: this simplified sample assumes the file to read is an ANSI text file // only for the purposes of output to the screen. CreateFile and ReadFile // do not use parameters to differentiate between text and binary file types. // int __cdecl _tmain(int argc, TCHAR *argv[]) < HANDLE hFile; DWORD dwBytesRead = 0; char ReadBuffer[BUFFERSIZE] = ; OVERLAPPED ol = ; printf("\n"); if( argc != 2 ) < printf("Usage Error: Incorrect number of arguments\n\n"); _tprintf(TEXT("Usage:\n\t%s \n"), argv[0]); return; > hFile = CreateFile(argv[1], // file to open GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // default security OPEN_EXISTING, // existing file only FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // normal file NULL); // no attr. template if (hFile == INVALID_HANDLE_VALUE) < DisplayError(TEXT("CreateFile")); _tprintf(TEXT("Terminal failure: unable to open file \"%s\" for read.\n"), argv[1]); return; >// Read one character less than the buffer size to save room for // the terminating NULL character. if( FALSE == ReadFileEx(hFile, ReadBuffer, BUFFERSIZE-1, &ol, FileIOCompletionRoutine) ) < DisplayError(TEXT("ReadFile")); printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError()); CloseHandle(hFile); return; >SleepEx(5000, TRUE); dwBytesRead = g_BytesTransferred; // This is the section of code that assumes the file is ANSI text. // Modify this block for other data types if needed. if (dwBytesRead > 0 && dwBytesRead else if (dwBytesRead == 0) < _tprintf(TEXT("No data read from file %s\n"), argv[1]); >else < printf("\n ** Unexpected value for dwBytesRead ** \n"); >// It is always good practice to close the open file handles even though // the app will exit here and clean up open handles anyway. CloseHandle(hFile); > void DisplayError(LPTSTR lpszFunction) // Routine Description: // Retrieve and output the system error message for the last-error code < LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); lpDisplayBuf = (LPVOID)LocalAlloc( LMEM_ZEROINIT, ( lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) // account for format string * sizeof(TCHAR) ); if (FAILED( StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error code %d as follows:\n%s"), lpszFunction, dw, lpMsgBuf))) < printf("FATAL ERROR: Unable to output error code.\n"); >_tprintf(TEXT("ERROR: %s\n"), (LPCTSTR)lpDisplayBuf); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); >
Приглашение открыть файл только для чтения
Если вы не хотите, чтобы рецензенты случайно изменили ваш документ, вы можете перед отправкой на рецензирование сделать его доступным только для чтения. Еще один способ — ограничить форматирование и редактирование.
Если вы сделаете файл документа доступным только для чтения, его можно будет читать и копировать, но нельзя будет изменять. Если один из рецензентов попытается внести изменения в файл, доступный только для чтения, для сохранения изменений ему придется присвоить документу новое имя или сохранить его в другом месте.
Примечание: Если вы сделаете документ доступным только для чтения, это не помешает другим лицам создавать его копии и сохранять их в другом месте с другим именем.
Ограничение редактирования
Вы можете ограничить редактирование документа, чтобы он открывся в режиме только для просмотра.
- На вкладке Файл выберите пункт Сведения.
- Выберите Защитить документ.

Изменение режима просмотра
Вы можете переключиться только с просмотра на другие режимы, предоставленные владельцем документа (редактирование, рецензирование).
- Перейдите на вкладку Просмотр , чтобы открыть параметры.
- Выберите Редактирование или Рецензирование.
Примечание: Единственными параметрами, которые можно выбрать, являются те, которые предоставил владелец документа.

Ограничение редактирования
- На вкладке Рецензирование нажмите кнопку Ограничить редактирование.

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

- Нажмите кнопку Да, включить защиту.

- В появившемся окне введите пароль, который сможете запомнить, и его подтверждение. Пароль необязательный. Но если вы не добавите пароль, любой пользователь может нажать кнопку Остановить защиту и изменить документ.
Задайте значение «Всегда открывать как только для чтения»
1. Выберите Файл > сведения > Защитить документ.

2. Выберите Всегда открывать только для чтения.

Открытие документа, к которым предоставлен общий доступ только для чтения
При открытии документа, к которому предоставлен общий доступ только для чтения, у вас есть два варианта.
Открытие документа только для чтения
Функция 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. Введение в программирование