Список полученных файлов не определен внешней печатной формой

Обновлено: 28.06.2024

Эта статья поможет вам диагностировать и устранять распространенные проблемы при загрузке файлов PDF или других типов документов через веб-приложение DocuSign. Более короткую статью о быстром устранении неполадок см. в разделе Быстрое устранение неполадок при загрузке документов.

Представленные здесь проблемы и решения предназначены для устранения неполадок при загрузке документов только с помощью веб-приложения DocuSign. Если у вас возникли проблемы с загрузкой документов через API, обратитесь к ресурсам, доступным в Центре разработчиков DocuSign.

Прежде чем продолжить, убедитесь, что загружаемый файл поддерживается DocuSign: см. Поддерживаемые форматы файлов.

Содержание

Проблема 1: ошибка при загрузке документа или произошла ошибка

Появляется всплывающее сообщение об ошибке: "Ошибка загрузки [имя файла]. Произошла ошибка".

Причина A: документ поврежден

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

Решение А

Сохранить как новый PDF-файл. Такие программы, как Adobe Reader®, Adobe Acrobat® и Foxit Reader®, имеют встроенную возможность исправления любых проблем со структурой/метаданными PDF-файла. Это можно исправить, открыв PDF-файл и сохранив его как новый файл.

Печать документа в новый PDF-файл: этот параметр поддерживается владельцами Adobe Acrobat Professional® (платно) или Foxit Reader (бесплатно). Это можно сделать, открыв файл в любой программе, выбрав «Файл» > «Печать» и выбрав Adobe PDF или Foxit PDF в качестве принтера. Выберите параметр «Сжать до области печати» и нажмите «ОК». Это распечатает документ в новый PDF-файл и уменьшит размер файла. Помните, что если в вашем документе есть активные поля формы, они будут сведены. Подробные инструкции можно найти здесь.

Использовать оптимизацию PDF: это инструмент, входящий в состав Adobe Acrobat Professional (версия 8 и выше), который повторно сэмплирует и сжимает документ, что приводит к уменьшению размера файла. Если у вас нет этого инструмента, вам нужно будет повторно отсканировать документ, используя приведенные выше советы, или воспользоваться бесплатным онлайн-оптимизатором --- хотя мы не рекомендуем загружать конфиденциальные документы в такие бесплатные сервисы

Используйте драйвер принтера DocuSign для загрузки документа. Драйвер принтера — это полезный инструмент, предоставляемый DocuSign, который часто устраняет эту проблему, а также многие другие проблемы с повреждением файлов. Этот инструмент позволяет отправить документ в конверт DocuSign непосредственно из программы PDF или текстового процессора.

Причина Б: документ содержит макросы

Макросы обычно используются в документах Microsoft Word® и Excel®. Хотя документы с расширениями файлов, предназначенными для макросов, поддерживаются (например, .xlsm, .docm, .pptm) ​​и документы с поддержкой макросов могут успешно загружаться, DocuSign технически не поддерживает документы с макросами. Вы можете проверить, содержит ли ваш документ макросы, открыв документ в соответствующей программе, выбрав «Просмотр» > «Макросы».

Решение Б

Удалите макросы. Откройте документ в соответствующей программе, выберите «Вид» > «Макросы» и удалите их.

Сохраните файл в формате PDF перед загрузкой. Это можно сделать с помощью функции «Файл» > «Сохранить как» в Word и Excel.

Причина C: документ защищен паролем или защищен

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

DocuSign не поддерживает документы, защищенные паролем доступа. Если вы попытаетесь загрузить такой документ, вы должны увидеть конкретную ошибку с указанием «этот файл защищен паролем».

"Ошибка загрузки [имя файла]: невозможно загрузить документ ([DocumentId]: защищен паролем [имя файла]). Документ защищен паролем, снимите защиту паролем перед использованием документа."

Примечание. Вы можете увидеть только общее сообщение об ошибке (на фото выше).

Примечание. DocuSign поддерживает файлы PDF, содержащие пароли владельцев и пользовательские настройки разрешений.

Решение C

Следующие шаги относятся к стороннему продукту и могут не совпадать с вашим личным опытом. Если эти шаги не помогли, обратитесь за дополнительной помощью к справочной документации для предпочитаемого вами редактора PDF:

Снимите защиту паролем доступа: откройте документ в программе, в которой он был создан. В соответствующих параметрах безопасности удалите пароль доступа. Например, в Adobe Acrobat выберите «Файл» > «Свойства» > «Безопасность» (или нажмите Ctrl — D).

Нажав «Изменить настройки», вы можете удалить пароль доступа, сняв флажок «Требовать пароль для открытия документа». (Если документ имеет пароль владельца, вы должны указать его в этом диалоговом окне, чтобы внести изменения.)

Проблема 2: тайм-аут во время загрузки или ошибка относительно размера файла

"Ошибка загрузки [имя файла]: размер файла превышает ограничение в 25 МБ".

Причина: слишком большой размер файла документа

Ограничение размера файла для одного документа, загружаемого в веб-приложение DocuSign, составляет 25 мегабайт (МБ) (25 000 килобайт [КБ]). Однако вы можете столкнуться с тайм-аутом для документов размером до 5 МБ (5000 КБ) в зависимости от вашего подключения к Интернету. Вы можете проверить размер файла своего документа, найдя его на своем компьютере, щелкнув правой кнопкой мыши и выбрав «Свойства». Рекомендуется не превышать размер файла 5 МБ (5 000 КБ).

Примечание. Это ограничение применяется ко всем функциям веб-загрузки. Вы можете столкнуться с похожими ошибками при загрузке вложения подписывающей стороны во время подписания или из внешнего источника (например, Box, DropBox, Google Drive, OneDrive).

Решение

Настройте параметры сканера. Убедитесь, что вы не сканируете в полноцветном или фотографическом качестве. Оттенки серого обычно приемлемы, но черно-белый вариант еще лучше. Если вам необходимо использовать цвет, уменьшите разрешение до 100–200 dpi (иногда называемое ppi). Большинство сканеров даже имеют предустановленную настройку качества документа, которая устанавливает эти параметры за вас.

Если это не сработало, попробуйте решения из проблемы 1.

Проблема 3: Сломанные эскизы, страницы не отображаются, "страница не может быть отображена"

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

Причина A: размеры документа слишком велики

Некоторые сканеры имеют тенденцию увеличивать размеры печатного документа, что может вызвать проблемы с визуализацией при подписании и отправке.

Вы можете диагностировать эту проблему, открыв документ в программе, в которой он был создан, и просмотрев его свойства. Ищите размеры. Они выходят за рамки стандартных размеров страниц документа?

Еще один способ проверить – отрегулировать масштаб/представление так, чтобы вы могли видеть одну страницу целиком, а затем посмотреть на процентное значение масштаба, необходимое для перехода на нужную страницу. Если процентное значение составляет менее 75 % (обычно где-то между 30 % и 50 %), это означает, что документ слишком велик.

Решение А

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

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

Если ни один из этих вариантов не сработал, попробуйте Решение А из Проблемы 1.

Причина Б: Многослойные изображения и/или аннотации

Файлы PDF содержат слои. Иногда это создает проблему при растеризации изображения страницы. Эта проблема также может быть вызвана документами в формате, отличном от PDF, с изображениями.

Решение Б

Чтобы решить эту проблему, распечатайте документ в новый PDF-файл. Этот вариант поддерживается владельцами Adobe Acrobat Professional (платно) или Foxit Reader (бесплатно).

  1. Выберите «Файл» > «Печать».
  2. Выберите AdobePDF или FoxitPDF в качестве принтера.
  3. Выберите параметр «Сжать до области печати».
  4. Нажмите "ОК".

Проблема 4. Отсутствуют данные поля формы PDF

При загрузке PDF-файла с полями формы и выборе «Применить/Назначить» некоторые данные формы отсутствуют в результирующих полях DocuSign; или при выборе Cancel/Flatten значение поля теряется.

Динамические PDF-файлы XFA будут автоматически отклонены. Вы увидите следующую ошибку:

Причина: PDF является активной формой XFA

XFA PDF – это PDF-файлы с возможностью заполнения форм, созданные такими популярными приложениями, как Adobe LiveCycle® и Thunderhead®. Хотя статические или активные PDF-файлы XFA будут успешно загружены, DocuSign поддерживает только PDF-файлы XFA, которые отображаются как статические. DocuSign отобразит предупреждение при загрузке такого документа, и вы можете вообще потерять распознавание некоторых полей формы и/или значений полей.

Решение

Сведение PDF-файла. Если вы не собираетесь преобразовывать поля PDF в поля DocuSign, попробуйте Решение Б из выпуска 1, чтобы сначала свести файл и данные.

Преобразовать в статический XFA: используйте приложение, в котором был создан PDF-файл, и сохраните его как статический XFA, а не как активный.

Проблема 5: поля формы PDF загружаются вертикально (кажутся повернутыми на 180°)

При загрузке поля формы в формате PDF и нажатии кнопки «Применить/назначить» все поля, преобразованные в поля DocuSign, отображаются вертикально, как будто все они были повернуты системой.

Причина: PDF-файл находится в ландшафтном режиме или выглядит как книжный, но его страницы на самом деле имеют свойства поворота

Некоторые PDF-файлы — чаще всего в ландшафтном режиме — имеют свойства поворота на страницах и/или в самих полях. Это сделано для того, чтобы PDF-файл было легче просматривать и заполнять в рамках данной программы чтения. DocuSign поддерживает горизонтальные документы. Чтобы обеспечить единообразие множества различных типов PDF-файлов, которые может загружать данный клиент, DocuSign не меняет ориентацию полей/страниц при преобразовании на основе базовых свойств ориентации файла.

Решение

Хотя тегировщик DocuSign позволяет поворачивать страницы документа после загрузки, DocuSign не поворачивает поля и не регулирует поворот текста в них — значения текстовых полей всегда вводятся слева направо, правой стороной вверх.

В этой статье объясняются новые возможности Python 3.0 по сравнению с 2.6. Python 3.0, также известный как «Python 3000» или «Py3K», является первым в истории намеренно несовместимым с предыдущими версиями выпуском Python. Изменений больше, чем в обычном выпуске, и больше важных для всех пользователей Python. Тем не менее, изучив изменения, вы обнаружите, что Python на самом деле изменился не так уж сильно — по большому счету, мы в основном исправляем хорошо известные недостатки и недочеты и удаляем много старого хлама.

В этой статье не делается попытка предоставить полную спецификацию всех новых функций, вместо этого мы пытаемся дать удобный обзор. Для получения полной информации вам следует обратиться к документации по Python 3.0 и/или множеству PEP, на которые есть ссылки в тексте. Если вы хотите понять полную реализацию и обоснование дизайна для конкретной функции, PEP обычно содержат больше деталей, чем обычная документация; но обратите внимание, что PEP обычно не обновляются после того, как функция полностью реализована.

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

Распространенные камни преткновения¶

В этом разделе перечислены те немногие изменения, которые, скорее всего, вызовут у вас затруднения, если вы привыкли к Python 2.5.

Печать — это функция¶

Операция print была заменена функцией print() с ключевыми аргументами, чтобы заменить большую часть специального синтаксиса старого оператора печати (PEP 3105). Примеры:

Вы также можете настроить разделитель между элементами, например:

Функция print() не поддерживает функцию "softspace" старого оператора печати. Например, в Python 2.x напечатайте «A\n», «B» напишет «A\nB\n»; но в Python 3.0 print("A\n", "B") пишет "A\n B\n" .

Поначалу вы обнаружите, что много печатаете старый шрифт x в интерактивном режиме. Пора переучить пальцы печатать вместо этого print(x)!

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

Представления и итераторы вместо списков¶

Некоторые известные API больше не возвращают списки:

Методы dict dict.keys() , dict.items() и dict.values() возвращают «представления» вместо списков. Например, это больше не работает: k = d.keys(); к.сортировать() . Вместо этого используйте k = sorted(d) (это работает и в Python 2.5 и столь же эффективно).

Кроме того, методы dict.iterkeys() , dict.iteritems() и dict.itervalues() больше не поддерживаются.

map() и filter() возвращают итераторы. Если вам действительно нужен список и все входные последовательности имеют одинаковую длину, быстрое решение — обернуть map() в list() , например list(map(. )) , но лучше часто использовать понимание списка (особенно когда в исходном коде используется lambda ) или переписать код, чтобы он вообще не нуждался в списке. Особенно сложно вызвать функцию map() из-за побочных эффектов функции; правильное преобразование состоит в использовании обычного цикла for (поскольку создание списка было бы просто расточительным).

Если входные последовательности не одинаковой длины, map() остановится в конце самой короткой из последовательностей. Для полной совместимости с map() из Python 2.x также оберните последовательности в itertools.zip_longest() , например map(func, *sequences) становится list(map(func, itertools.zip_longest(*sequences))) .

range() теперь ведет себя так же, как xrange(), за исключением того, что он работает со значениями произвольного размера. Последнего больше не существует.

zip() теперь возвращает итератор.

Сравнения заказов¶

Python 3.0 упростил правила упорядочивания сравнений:

встроенные.sorted() и list.sort() больше не принимают аргумент cmp, обеспечивающий функцию сравнения. Вместо этого используйте аргумент key. Н.Б. аргументы key и reverse теперь являются «только ключевыми словами».

Функция cmp() должна считаться устаревшей, а специальный метод __cmp__() больше не поддерживается. Используйте __lt__() для сортировки, __eq__() с __hash__() и другие расширенные сравнения по мере необходимости.(Если вам действительно нужна функциональность cmp(), вы можете использовать выражение (a > b) - (a < b) как эквивалент cmp(a, b) .)

Целые числа¶

PEP 237: по сути, давно переименован в int . То есть существует только один встроенный целочисленный тип с именем int; но в основном он ведет себя как старый длинный тип.

PEP 238: выражение типа 1/2 возвращает число с плавающей запятой. Используйте 1//2, чтобы получить поведение усечения. (Последний синтаксис существует уже много лет, по крайней мере, с Python 2.2.)

Константа sys.maxint была удалена, так как больше нет ограничения на значение целых чисел. Однако sys.maxsize можно использовать как целое число, большее, чем любой практичный список или строковый индекс. Он соответствует «естественному» целочисленному размеру реализации и обычно совпадает с sys.maxint в предыдущих выпусках на той же платформе (при тех же параметрах сборки).

Repr() длинного целого числа больше не включает L в конце, поэтому код, который безоговорочно удаляет этот символ, вместо этого отрезает последнюю цифру. (Вместо этого используйте str().)

Восьмеричные литералы больше не имеют формы 0720 ; вместо этого используйте 0o720.

Все, что вы знали о двоичных данных и Unicode, изменилось.

Вследствие этого изменения философии почти весь код, использующий Unicode, кодировки или двоичные данные, скорее всего, должен измениться. Изменения к лучшему, так как в мире 2.x было множество ошибок, связанных с смешиванием закодированного и незакодированного текста. Чтобы подготовиться к работе с Python 2.x, начните использовать unicode для всего незакодированного текста и str только для двоичных или закодированных данных. Тогда инструмент 2to3 сделает за вас большую часть работы.

Вы больше не можете использовать литералы u". " для текста Unicode. Однако вы должны использовать литералы b". " для двоичных данных.

Поскольку типы str и bytes нельзя смешивать, вы всегда должны выполнять явное преобразование между ними. Используйте str.encode() для перехода от str к bytes и bytes.decode() для перехода от bytes к str . Вы также можете использовать bytes(s, encoding=. ) и str(b, encoding=. ) соответственно.

Как и str , тип bytes неизменяем. Существует отдельный тип mutable для хранения буферизованных двоичных данных, bytearray. Почти все API, которые принимают байты, также принимают bytearray. Изменяемый API основан на collections.MutableSequence .

Все символы обратной косой черты в необработанных строковых литералах интерпретируются буквально. Это означает, что escape-символы '\U' и '\u' в необработанных строках не обрабатываются особым образом. Например, r'\u20ac' — это строка из 6 символов в Python 3.0, тогда как в версии 2.6 ur'\u20ac' был единственным символом «евро». (Конечно, это изменение влияет только на необработанные строковые литералы; символ евро — это '\u20ac' в Python 3.0.)

Встроенный абстрактный тип базовой строки удален. Вместо этого используйте ул. У типов str и bytes недостаточно общих функциональных возможностей, чтобы гарантировать общий базовый класс. Инструмент 2to3 (см. ниже) заменяет каждое вхождение basestring на str .

Файлы, открытые как текстовые файлы (все еще режим по умолчанию для open() ), всегда используют кодировку для отображения между строками (в памяти) и байтами (на диске). Двоичные файлы (открываемые с помощью b в аргументе режима) всегда используют байты в памяти. Это означает, что если файл открывается с использованием неправильного режима или кодировки, ввод-вывод, скорее всего, будет громко давать сбой, вместо того, чтобы молча создавать неверные данные. Это также означает, что даже пользователи Unix должны будут указать правильный режим (текстовый или двоичный) при открытии файла. Существует кодировка по умолчанию, зависящая от платформы, которая на платформах Unixy может быть установлена ​​с помощью переменной среды LANG (а иногда также с некоторыми другими переменными среды, связанными с локалью, зависящей от платформы). Во многих случаях, но не во всех, по умолчанию используется кодировка UTF-8; вы никогда не должны рассчитывать на это значение по умолчанию. Любое приложение, читающее или пишущее больше, чем чистый текст ASCII, вероятно, должно иметь способ переопределить кодировку. Больше нет необходимости использовать потоки с поддержкой кодирования в модуле кодеков.

Исходные значения sys.stdin , sys.stdout и sys.stderr теперь являются текстовыми файлами только в формате Unicode (т. е. они являются экземплярами io.TextIOBase ). Чтобы читать и записывать байты данных с помощью этих потоков, вам нужно использовать их атрибут io.TextIOBase.buffer.

Имена файлов передаются в API и возвращаются из них в виде строк (Unicode). Это может привести к проблемам, связанным с платформой, поскольку на некоторых платформах имена файлов представляют собой произвольные строки байтов. (С другой стороны, в Windows имена файлов изначально хранятся в формате Unicode.) В качестве обходного пути большинство API (например, open() и многие функции в модуле os), принимающие имена файлов, принимают байтовые объекты, а также строки, а у нескольких API есть способ запросить возвращаемое значение в байтах. Таким образом, os.listdir() возвращает список экземпляров байтов, если аргумент является экземпляром байтов, а os.getcwdb() возвращает текущий рабочий каталог как экземпляр байтов. Обратите внимание, что когда os.listdir() возвращает список строк, имена файлов, которые не могут быть правильно декодированы, опускаются, а не вызывают UnicodeError .

Некоторые системные API, такие как os.environ и sys.argv также может создавать проблемы, когда байты, предоставляемые системой, не поддаются интерпретации с использованием кодировки по умолчанию. Установка переменной LANG и повторный запуск программы, вероятно, являются лучшим подходом.

PEP 3138: repr() строки больше не экранирует символы, отличные от ASCII. Однако он по-прежнему экранирует управляющие символы и кодовые точки с непечатаемым статусом в стандарте Unicode.

PEP 3120: исходная кодировка по умолчанию теперь UTF-8.

PEP 3131: в идентификаторах теперь разрешены буквы, отличные от ASCII. (Однако стандартная библиотека остается только для ASCII, за исключением имен участников в комментариях.)

Модули StringIO и cStringIO больше не используются. Вместо этого импортируйте модуль io и используйте io.StringIO или io.BytesIO для текста и данных соответственно.

См. также руководство по Unicode HOWTO , которое было обновлено для Python 3.0.

Обзор изменений синтаксиса¶

В этом разделе дается краткий обзор всех синтаксических изменений в Python 3.0.

Новый синтаксис¶

PEP 3107: Аннотации аргумента функции и возвращаемого значения. Это обеспечивает стандартизированный способ аннотирования параметров функции и возвращаемого значения. К таким аннотациям не привязана семантика, за исключением того, что их можно исследовать во время выполнения с помощью атрибута __annotations__. Цель состоит в том, чтобы поощрять эксперименты с помощью метаклассов, декораторов или фреймворков.

PEP 3102: аргументы, содержащие только ключевые слова. Именованные параметры, расположенные после *args в списке параметров, должны указываться с использованием синтаксиса ключевого слова в вызове. Вы также можете использовать пустой * в списке параметров, чтобы указать, что вы не принимаете список аргументов переменной длины, но у вас есть аргументы, содержащие только ключевые слова.

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

PEP 3104: нелокальный оператор. Используя нелокальный x, теперь вы можете напрямую назначать переменную во внешней (но не глобальной) области видимости. nonlocal — новое зарезервированное слово.

PEP 3132: расширенная итерируемая распаковка. Теперь вы можете писать такие вещи, как a, b, *rest = some_sequence. И даже *rest, a = stuff . Остальной объект всегда представляет собой (возможно, пустой) список; правая часть может быть любой итерируемой. Пример:

Это устанавливает a в 0 , b в 4 и rest в [1, 2, 3] .

Словарное понимание: означает то же самое, что и dict(stuff), но более гибкое. (Это подтверждено PEP 274. :-)

Установите литералы, например. . Обратите внимание, что <> — пустой словарь; используйте set() для пустого набора. Также поддерживаются комплексные понимания; например, означает то же самое, что и set(stuff), но более гибкий.

Новые восьмеричные литералы, например. 0o720 (уже в 2.6). Старые восьмеричные литералы ( 0720 ) исчезли.

Новые двоичные литералы, например. 0b1010 (уже в версии 2.6), и есть новая соответствующая встроенная функция bin() .

Байтовые литералы вводятся с предшествующей буквой b или B , и есть новая соответствующая встроенная функция, bytes() .

Измененный синтаксис¶

as и with теперь являются зарезервированными словами. (Начиная с версии 2.6.)

True , False и None являются зарезервированными словами. (В версии 2.6 уже частично введены ограничения для None.)

PEP 3115: новый синтаксис метакласса. Вместо:

теперь вы должны использовать:

Глобальная модульная переменная __metaclass__ больше не поддерживается. (Это был костыль, чтобы упростить использование по умолчанию классов нового стиля без наследования каждого класса от object .)

Списковые включения больше не поддерживают синтаксическую форму [. для var в item1 , item2 , . ]. Использовать [. вместо var в ( item1 , item2 , . )]. Также обратите внимание, что списковые включения имеют другую семантику: они ближе к синтаксическому сахару для выражения генератора внутри конструктора list(), и, в частности, переменные управления циклом больше не просачиваются в окружающую область.

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

Удален синтаксис¶

PEP 3113: распаковка параметров кортежа удалена. Вы больше не можете писать def foo(a, (b, c)): . . Вместо этого используйте def foo(a, b_c): b, c = b_c.

Удалены обратные кавычки (вместо них используйте repr()).

Удалено <> (вместо этого используйте !=).

Удалено ключевое слово: exec() больше не является ключевым словом; она остается как функция. (К счастью, синтаксис функции был принят и в версии 2.x.) Также обратите внимание, что функция exec() больше не принимает потоковый аргумент; вместо exec(f) вы можете использовать exec(f.read()) .

Целые литералы больше не поддерживают символы l или L в конце.

Строковые литералы больше не поддерживают u или U в начале.

Синтаксис from module import * разрешен только на уровне модуля, а не внутри функций.

Единственный приемлемый синтаксис для относительного импорта — from .[ module ] import name . Все формы импорта, не начинающиеся с . интерпретируются как абсолютный импорт. (PEP 328)

Классические курсы исчезли.

Изменения, уже присутствующие в Python 2.6¶

Поскольку многие пользователи, по-видимому, сразу переходят с Python 2.5 на Python 3.0, этот раздел напоминает читателю о новых функциях, которые изначально были разработаны для Python 3.0, но были перенесены в Python 2.6. Подробные описания можно найти в соответствующих разделах «Что нового в Python 2.6».

PEP 343: Оператор with . Оператор with теперь является стандартной функцией, и его больше не нужно импортировать из __future__ . Также ознакомьтесь с разделами «Написание менеджеров контекста» и «Модуль contextlib» .

PEP 366: явный относительный импорт из основного модуля . Это повышает полезность параметра -m, когда указанный модуль находится в пакете.

PEP 3105: печать как функция . Теперь это стандартная функция, и ее больше не нужно импортировать из __future__ . Более подробная информация была дана выше.

PEP 3110: Изменения в обработке исключений . Исключение exc как синтаксис var теперь является стандартным, кроме exc, var больше не поддерживается. (Конечно, часть as var по-прежнему необязательна.)

PEP 3112: байтовые литералы . Обозначение строкового литерала b". " (и его варианты, такие как b'. ' , b""". """ и br". " ) теперь создает литерал типа bytes .

PEP 3116: новая библиотека ввода/вывода . Модуль io теперь является стандартным способом выполнения файлового ввода-вывода. Встроенная функция open() теперь является псевдонимом для io.open() и имеет дополнительные аргументы ключевого слова кодировка, ошибки, новая строка и закрыть. Также обратите внимание, что недопустимый аргумент mode теперь вызывает ValueError , а не IOError . Доступ к объекту двоичного файла, лежащему в основе объекта текстового файла, можно получить как f.buffer (но имейте в виду, что текстовый объект поддерживает собственный буфер для ускорения операций кодирования и декодирования).

PEP 3118: пересмотренный протокол буфера. Старой встроенной функции buffer() больше нет; новый встроенный memoryview() обеспечивает (в основном) аналогичную функциональность.

PEP 3119: абстрактные базовые классы . Модуль abc и ABC, определенные в модуле collections, теперь играют более заметную роль в языке, а встроенные типы коллекций, такие как dict и list, соответствуют ABC collections.MutableMapping и collections.MutableSequence соответственно.

PEP 3127: поддержка целочисленного литерала и синтаксис . Как упоминалось выше, поддерживается только новая восьмеричная литеральная запись, и были добавлены двоичные литералы.

PEP 3141: Иерархия типов для чисел . Модуль чисел — еще одно новое использование ABC, определяющее «числовую башню» Python. Также обратите внимание на новый модуль фракций, который реализует Numbers.Rational .

Изменения в библиотеке¶

Из-за нехватки времени этот документ не охватывает исчерпывающим образом очень обширные изменения в стандартной библиотеке. PEP 3108 — это справочник по основным изменениям в библиотеке. Вот обзор капсулы:

Многие старые модули были удалены. Некоторые из них, такие как gopherlib (больше не используется) и md5 (замененный на hashlib), уже объявлены устаревшими в PEP 4. Другие были удалены в результате прекращения поддержки различных платформ, таких как Irix, BeOS и Mac OS 9 (см. PEP 11). Некоторые модули также были выбраны для удаления в Python 3.0 из-за неиспользования или из-за того, что существует лучшая замена. Полный список см. в PEP 3108.

Некоторые модули были переименованы, потому что их старое имя не соответствовало PEP 8 или по другим причинам. Вот список:

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

Требования: Базовая компьютерная грамотность, базовое понимание HTML и CSS, первые шаги в JavaScript.
Цель: Понять основные концепции функций JavaScript.

Где найти функции?

В JavaScript вы найдете функции везде. На самом деле, мы использовали функции на протяжении всего курса; мы просто не говорили о них очень много. Однако сейчас самое время поговорить о функциях в явном виде и по-настоящему изучить их синтаксис.

Практически каждый раз, когда вы используете структуру JavaScript, содержащую пару круглых скобок — () — и вы не используете стандартную встроенную языковую структуру, такую ​​как цикл for, while или do. цикл while или если. else, вы используете функцию.

Встроенные функции браузера

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

Или каждый раз, когда мы манипулировали массивом:

Или каждый раз, когда мы генерируем случайное число:

<р>. мы использовали функцию!

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

В языке JavaScript есть множество встроенных функций, которые позволяют вам делать полезные вещи без необходимости писать весь этот код самостоятельно. На самом деле, часть кода, который вы вызываете при вызове встроенной функции браузера (причудливое слово для запуска или выполнения), не может быть написана на JavaScript — многие из этих функций вызывают части фонового кода браузера, которые написан в основном на низкоуровневых системных языках, таких как C++, а не на веб-языках, таких как JavaScript.

Имейте в виду, что некоторые встроенные функции браузера не являются частью основного языка JavaScript. Некоторые из них определены как часть API-интерфейсов браузера, которые строятся на основе языка по умолчанию для обеспечения еще большей функциональности (см. этот ранний раздел). нашего курса для получения дополнительных описаний). Мы рассмотрим использование API браузера более подробно в следующем модуле.

Функции и методы

Функции, являющиеся частью объектов, называются методами. Вам пока не нужно изучать внутреннюю работу структурированных объектов JavaScript — вы можете подождать до следующего модуля, в котором вы узнаете все о внутренней работе объектов и о том, как создавать свои собственные. На данный момент мы просто хотели прояснить возможную путаницу между методом и функцией — вы, вероятно, встретите оба термина, просматривая доступные связанные ресурсы в Интернете.

Встроенный код, который мы использовали до сих пор, представлен в обеих формах: функциях и методах. Полный список встроенных функций, а также встроенных объектов и соответствующих им методов можно посмотреть здесь.

Вы также уже видели в курсе множество пользовательских функций — функций, определенных в вашем коде, а не в браузере. Каждый раз, когда вы видели пользовательское имя со скобками сразу после него, вы использовали пользовательскую функцию. В нашем примере random-canvas-circles.html (см. также полный исходный код) из нашей статьи о циклах мы включили пользовательскую функцию draw(), которая выглядела следующим образом:

вместо того, чтобы писать весь этот код каждый раз, когда мы хотим его повторить. И функции могут содержать любой код, который вам нравится — вы даже можете вызывать другие функции из функций. Вышеупомянутая функция, например, трижды вызывает функцию random(), что определяется следующим кодом:

Эта функция понадобилась нам, потому что встроенная в браузер функция Math.random() генерирует только случайное десятичное число от 0 до 1. Нам нужно было случайное целое число от 0 до указанного числа.

Вызов функций

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

Примечание. Эта форма создания функции также называется объявлением функции. Он всегда поднимается, поэтому вы можете вызывать функцию над определением функции, и она будет работать нормально.

Параметры функции

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

Примечание. Параметры иногда называют аргументами, свойствами или даже атрибутами.

Например, встроенная в браузер функция Math.random() не требует никаких параметров. При вызове он всегда возвращает случайное число от 0 до 1:

Однако для встроенной в браузер функции замены строки требуется два параметра — подстрока, которую нужно найти в основной строке, и подстрока, на которую эта строка заменяется:

Примечание. Если вам нужно указать несколько параметров, они разделяются запятыми.

Необязательные параметры

Иногда параметры являются необязательными — их не нужно указывать. Если вы этого не сделаете, функция обычно примет какое-то поведение по умолчанию. Например, параметр функции join() для массива является необязательным:

Если для указания символа соединения/разделения не указан параметр, по умолчанию используется запятая.

Параметры по умолчанию

Если вы пишете функцию и хотите поддерживать необязательные параметры, вы можете указать значения по умолчанию, добавив = после имени параметра, за которым следует значение по умолчанию:

Анонимные функции и стрелочные функции

Пока что мы только что создали такую ​​функцию:

Но вы также можете создать функцию без имени:

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

Примечание. Эта форма создания функции также известна как выражение функции. В отличие от объявления функции, функциональные выражения не поднимаются.

Пример анонимной функции

Например, предположим, что вы хотите запускать некоторый код, когда пользователь вводит текст в текстовое поле. Для этого вы можете вызвать функцию addEventListener() текстового поля. Эта функция ожидает, что вы передадите ей (как минимум) два параметра:

  • название события для прослушивания, в данном случае "keydown"
  • функция, запускаемая при возникновении события.

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

Вместо определения отдельной функции logKey() вы можете передать анонимную функцию в addEventListener():

Функции со стрелками

Если вы передаете анонимную функцию, подобную этой, вы можете использовать альтернативную форму, называемую функцией стрелки. Вместо function(event) вы пишете (event) => :

Если у функции есть только одна строка в фигурных скобках, вы опускаете фигурные скобки:

Если функция принимает только один параметр, вы также можете опустить скобки вокруг параметра:

Наконец, если ваша функция должна возвращать значение и содержит только одну строку, вы также можете опустить оператор return. В следующем примере мы используем метод map() массива, чтобы удвоить каждое значение в исходном массиве:

Метод map() берет каждый элемент массива по очереди и передает его в заданную функцию. Затем он берет значение, возвращенное этой функцией, и добавляет его в новый массив.

Таким образом, в приведенном выше примере item => item * 2 является эквивалентом стрелочной функции:

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

Примечание. Между функциями стрелок и обычными функциями есть небольшие различия. Они выходят за рамки этого вводного руководства и вряд ли будут иметь значение в случаях, которые мы здесь обсуждали. Дополнительные сведения см. в справочной документации по стрелочным функциям.

Живой образец функции стрелки

Вот полный рабочий пример примера нажатия клавиши, который мы обсуждали выше:

Результат — попробуйте ввести текст в текстовое поле и посмотрите, что будет:

Область действия и конфликты

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

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

JavaScript настроен таким образом по разным причинам, но в основном из-за безопасности и организации. Иногда вы не хотите, чтобы переменные были доступны отовсюду в коде — внешние скрипты, которые вы вызываете из другого места, могут начать путаться в вашем коде и вызвать проблемы, потому что они используют те же имена переменных, что и другие части кода. , вызывая конфликты. Это может быть сделано злонамеренно или случайно.

Например, предположим, что у вас есть файл HTML, который вызывает два внешних файла JavaScript, и в обоих из них определены переменная и функция, использующие одно и то же имя:

Обе функции, которые вы хотите вызвать, называются Greeting() , но вы можете получить доступ только к функции Greeting() первого файла .js (вторая функция игнорируется). Кроме того, возникает ошибка при попытке (во втором файле.js) присвоить новое значение переменной name, потому что она уже была объявлена ​​с помощью const и поэтому не может быть переназначена.

Примечание. Вы можете увидеть этот пример в реальном времени на GitHub (см. также исходный код).

Сохранение частей кода в функциях позволяет избежать таких проблем и считается лучшей практикой.

Это немного похоже на зоопарк. Львы, зебры, тигры и пингвины содержатся в своих вольерах и имеют доступ только к вещам внутри своих вольеров — таким же образом, как и области действия. Если бы они могли попасть в другие корпуса, возникли бы проблемы.В лучшем случае разные животные будут чувствовать себя очень некомфортно в незнакомой среде обитания — лев или тигр будут чувствовать себя ужасно в водном, ледяном владении пингвинов. В худшем случае пингвинов попытаются съесть львы и тигры!

< бр />

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

Активное обучение: игра с масштабом

Давайте рассмотрим реальный пример, чтобы продемонстрировать область действия.

  1. Сначала сделайте локальную копию нашего примера function-scope.html. Он содержит две функции с именами a() и b() и три переменные — x, y и z — две из которых определены внутри функций, а одна — в глобальной области видимости. Он также содержит третью функцию с именем output() , которая принимает один параметр и выводит его в абзаце на странице.
  2. Откройте пример в браузере и текстовом редакторе.
  3. Откройте консоль JavaScript в инструментах разработчика браузера. В консоли JavaScript введите следующую команду:

Сохраните код и перезагрузите его в браузере, а затем попробуйте вызвать функции a() и b() из консоли JavaScript:

Примечание: одни и те же правила области действия не применяются к циклам (например, for() < . >) и условным блокам (например, if() < . >) — они очень похожи, но это не одно и то же! Будьте осторожны, чтобы не перепутать их.

Примечание. Ошибка ReferenceError: "x" не определена — одна из наиболее распространенных ошибок. Если вы получили эту ошибку и уверены, что определили рассматриваемую переменную, проверьте, в какой области она находится.

Проверьте свои навыки!

Вы дошли до конца этой статьи, но можете ли вы вспомнить самую важную информацию? Вы можете найти дополнительные тесты, чтобы убедиться, что вы сохранили эту информацию, прежде чем двигаться дальше — см. Проверка ваших навыков: функции. Эти тесты требуют навыков, описанных в следующих двух статьях, поэтому вы можете сначала прочитать их, прежде чем пробовать.

Заключение

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

Работа с файлами так же распространена как в целях разработки, так и в целях, не связанных с разработкой. При повседневном использовании компьютера пользователь, скорее всего, будет читать и записывать данные в файлы в различных каталогах для выполнения таких задач, как сохранение загруженного файла или доступ к данным для использования в другом приложении. Точно так же серверной программе или инструменту интерфейса командной строки (CLI) может потребоваться записать загруженные данные в файл, чтобы сохранить их, или приложению, интенсивно использующему данные, может потребоваться экспортировать в JSON, CSV или Excel. форматы. Эти программы должны взаимодействовать с файловой системой операционной системы, в которой они работают.

С Node.js вы можете программно манипулировать файлами с помощью встроенного модуля fs. Название является сокращением от «файловая система», и модуль содержит все функции, необходимые для чтения, записи и удаления файлов на локальном компьютере. Этот уникальный аспект Node.js делает JavaScript удобным языком для программирования серверных приложений и инструментов CLI.

В этой статье вы будете использовать модуль fs для чтения файла, созданного с помощью командной строки, создания нового файла и записи в него, удаления созданного файла и перемещения первого файла в другую папку. Модуль fs поддерживает взаимодействие с файлами синхронно, асинхронно или через потоки; в этом руководстве основное внимание будет уделено тому, как использовать асинхронный API на основе Promise — наиболее часто используемый метод для разработчиков Node.js.

Предпосылки

Чтобы получить доступ к модулю fs и следовать инструкциям, на вашем компьютере должен быть установлен Node.js. В этом руководстве используется Node.js версии 10.22.0. Чтобы установить Node.js в macOS или Ubuntu 18.04, выполните действия, описанные в разделе «Установка Node.js и создание локальной среды разработки в macOS» или в разделе «Установка с помощью PPA» в разделе «Как установить Node.js в Ubuntu 18.04».

В этой статье для работы с файлами используются промисы JavaScript, особенно с синтаксисом async/await. Если вы не знакомы с промисами, синтаксисом async/await или асинхронным программированием, ознакомьтесь с нашим руководством «Как писать асинхронный код в Node.js».

Шаг 1 — Чтение файлов с помощью readFile()

На этом шаге вы напишете программу для чтения файлов в Node.js. Для этого вам потребуется импортировать модуль fs, стандартный модуль Node.js для работы с файлами, а затем использовать функцию модуля readFile(). Ваша программа прочитает файл, сохранит его содержимое в переменной, а затем выведет его содержимое на консоль.

Первым шагом будет настройка среды кодирования для этого задания и действий, описанных в последующих разделах.

Создайте папку для хранения кода.В вашем терминале создайте папку с именем node-files :

Измените рабочий каталог на только что созданную папку с помощью команды cd:

В этой папке вы создадите два файла. Первый файл будет новым файлом с содержимым, которое ваша программа будет читать позже. Второй файл будет модулем Node.js, который читает файл.

Создайте файл Greetings.txt с помощью следующей команды:

Команда echo выводит свой строковый аргумент на терминал. Вы используете > для перенаправления вывода эха в новый файл Greetings.txt .

Теперь создайте и откройте readFile.js в любом текстовом редакторе. В этом руководстве используется текстовый редактор терминала nano. Вы можете открыть этот файл с помощью nano следующим образом:

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

Как упоминалось ранее, вы используете модуль fs для взаимодействия с файловой системой. Однако обратите внимание, что вы импортируете часть модуля .promises.

Когда модуль fs был впервые создан, основным способом написания асинхронного кода в Node.js были обратные вызовы. По мере того, как популярность промисов росла, команда Node.js работала над их поддержкой в ​​модуле fs из коробки. В Node.js версии 10 они создали объект promises в модуле fs, который использует промисы, в то время как основной модуль fs продолжает предоставлять функции, использующие обратные вызовы. В этой программе вы импортируете обещанную версию модуля.

После импорта модуля вы можете создать асинхронную функцию для чтения файла. Асинхронные функции начинаются с ключевого слова async. С помощью асинхронной функции вы можете разрешать промисы с помощью ключевого слова await вместо связывания промисов с методом .then().

Создайте новую функцию readFile(), которая принимает один аргумент — строку с именем filePath . Ваша функция readFile() будет использовать модуль fs для загрузки файла в переменную с использованием синтаксиса async/await.

Введите следующий выделенный код:

Вы определяете функцию с помощью ключевого слова async, чтобы впоследствии можно было использовать соответствующее ключевое слово await. Чтобы зафиксировать ошибки в вашей асинхронной операции чтения файла, вы заключаете вызов fs.readFile() с попыткой. поймать блок. В разделе try вы загружаете файл в переменную данных с помощью функции fs.readFile(). Единственным обязательным аргументом для этой функции является путь к файлу, который задается в виде строки.

По умолчанию функция fs.readFile() возвращает объект буфера. Буферный объект может хранить файлы любого типа. Когда вы регистрируете содержимое файла, вы конвертируете эти байты в текст с помощью метода toString() объекта буфера.

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

Наконец, вызовите функцию в файле Greetings.txt со следующей выделенной строкой:

Обязательно сохраните содержимое. С nano вы можете сохранить и выйти, нажав CTRL+X .

Теперь ваша программа прочитает созданный ранее файл Greetings.txt и запишет его содержимое в терминал. Подтвердите это, выполнив свой модуль с узлом:

Вы получите следующий вывод:

Теперь вы прочитали файл с помощью функции readFile() модуля fs, используя синтаксис async/await.

Примечание. В некоторых более ранних версиях Node.js вы получите следующее предупреждение при использовании модуля fs:

Объект promises модуля fs был введен в Node.js версии 10, поэтому в некоторых более ранних версиях этот модуль по-прежнему называется экспериментальным. Это предупреждение было удалено, когда API стал стабильным в версии 12.6.

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

Шаг 2 — Запись файлов с помощью writeFile()

На этом этапе вы будете записывать файлы с помощью функции writeFile() модуля fs. Вы создадите CSV-файл в Node.js, в котором будет отслеживаться счет за продукты. При первой записи файла вы создадите файл и добавите заголовки. Во второй раз вы добавите данные в файл.

Откройте новый файл в текстовом редакторе:

Начните свой код с импорта модуля fs:

Вы продолжите использовать синтаксис async/await при создании двух функций. Первой функцией будет создание CSV-файла. Второй функцией будет добавление данных в файл CSV.

В текстовом редакторе введите следующий выделенный код:

Эта асинхронная функция сначала создает переменную csvHeaders, содержащую заголовки столбцов CSV-файла. Затем вы используете функцию writeFile() модуля fs для создания файла и записи в него данных. Первый аргумент — это путь к файлу. Поскольку вы указали только имя файла, Node.js создаст файл в том же каталоге, в котором вы выполняете код. Второй аргумент — это данные, которые вы записываете, в данном случае это переменная csvHeaders.

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

Асинхронная функция addGroceryItem() принимает три аргумента: название продукта, количество, которое вы покупаете, и цену за единицу. Эти аргументы используются с синтаксисом литерала шаблона для формирования переменной csvLine, которая является данными, которые вы записываете в файл.

Затем вы используете метод writeFile() так же, как и в функции openFile(). Однако на этот раз у вас есть третий аргумент: объект JavaScript. Этот объект имеет ключ флага со значением a . Флаги сообщают Node.js, как взаимодействовать с файлом в системе. Используя флаг a , вы говорите Node.js добавлять в файл, а не перезаписывать его. Если вы не укажете флаг, по умолчанию используется w, который создает новый файл, если его нет, или перезаписывает файл, если он уже существует. Вы можете узнать больше о флагах файловой системы в документации Node.js.

Чтобы завершить сценарий, используйте эти функции. Добавьте следующие выделенные строки в конец файла:

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

Ваши функции openFile() и addGroceryItem() являются асинхронными функциями. Без включения этих вызовов в другую функцию вы не можете гарантировать порядок содержимого. Созданная вами оболочка определяется ключевым словом async. Внутри этой функции вы упорядочиваете вызовы функций с помощью ключевого слова await.

Наконец, определение асинхронной функции заключено в круглые скобки. Они сообщают JavaScript, что код внутри них является функциональным выражением. Скобки в конце функции и перед точкой с запятой используются для немедленного вызова функции. Это называется выражением немедленно вызываемой функции (IIFE). Используя IIFE с анонимной функцией, вы можете проверить, что ваш код создает файл CSV с тремя строками: заголовки столбцов, строка для яиц и последняя строка для nutella .

Сохраните и выйдите из nano, нажав CTRL+X .

Теперь запустите свой код с помощью команды node:

Вывода не будет. Однако в вашем текущем каталоге будет существовать новый файл.

Используйте команду cat для отображения содержимого groceries.csv:

Вы получите следующий вывод:

Ваш вызов openFile() создал новый файл и добавил заголовки столбцов для вашего CSV. Последующие вызовы addGroceryItem() добавили ваши две строки данных.

С помощью функции writeFile() вы можете создавать и редактировать файлы. Затем вы удалите файлы. Это обычная операция, когда у вас есть временные файлы или вам нужно освободить место на жестком диске.

Шаг 3 — Удаление файлов с помощью unlink()

На этом шаге вы удалите файлы с помощью функции unlink() в модуле fs. Вы напишете сценарий Node.js для удаления файла groceries.csv, созданного в предыдущем разделе.

В терминале создайте новый файл для этого модуля Node.js:

Теперь вы напишете код, создающий асинхронную функцию deleteFile(). Эта функция примет путь к файлу в качестве аргумента, передав его функции unlink() для удаления из вашей файловой системы.

В текстовом редакторе напишите следующий код:

Функция unlink() принимает один аргумент: путь к файлу, который вы хотите удалить.

Предупреждение. Когда вы удаляете файл с помощью функции unlink(), он не отправляется в вашу корзину или корзину, а навсегда удаляется из вашей файловой системы. Это действие необратимо, поэтому перед выполнением кода убедитесь, что вы хотите удалить файл.

Выйдите из nano , убедившись, что вы сохранили содержимое файла, нажав CTRL+X .

Теперь запустите программу. Запустите следующую команду в своем терминале:

Вы получите следующий вывод:

Чтобы подтвердить, что файл больше не существует, используйте команду ls в текущем каталоге:

Эта команда отобразит следующие файлы:

Теперь вы подтвердили, что ваш файл был удален с помощью функции unlink().

Вы научились читать, писать, редактировать и удалять файлы. В следующем разделе используется функция для перемещения файлов в разные папки. Изучив эту функцию, вы сможете выполнять самые важные задачи по управлению файлами в Node.js.

Шаг 4 — Перемещение файлов с помощью rename()

Папки используются для организации файлов, поэтому возможность программного перемещения файлов из одной папки в другую упрощает управление файлами. Вы можете перемещать файлы в Node.js с помощью функции rename(). На этом шаге вы переместите копию файла Greetings.txt в новую папку.

Прежде чем вы сможете написать свой модуль Node.js, вам нужно настроить несколько вещей.Начните с создания папки, в которую вы будете перемещать файл. В терминале создайте папку test-data в текущем каталоге:

Теперь скопируйте файл Greetings.txt, который использовался на первом этапе, с помощью команды cp:

Завершите настройку, открыв файл JavaScript, содержащий ваш код:

В модуле Node.js вы создадите функцию с именем moveFile(), которая вызывает функцию rename(). При использовании функции rename() вам необходимо указать путь к исходному файлу и путь к месту назначения. В этом примере вы будете использовать функцию moveFile() для перемещения файла Greetings-2.txt в папку test-data. Вы также измените его название на salutations.txt .

Введите следующий код в текстовом редакторе:

Как упоминалось ранее, функция rename() принимает два аргумента: путь к исходному файлу и путь к файлу назначения. Эта функция может перемещать файлы в другие папки, переименовывать файл в его текущем каталоге или перемещать и переименовывать одновременно. В своем коде вы перемещаете и переименовываете свой файл.

Сохраните и выйдите из nano, нажав CTRL+X .

Затем выполните эту программу с узлом . Введите эту команду, чтобы запустить программу:

Вы получите следующий вывод:

Чтобы подтвердить, что файл больше не существует в вашем текущем каталоге, вы можете использовать команду ls:

Эта команда отобразит эти файлы и папки:

Теперь вы можете использовать ls для вывода списка файлов в подпапке test-data:

Ваш перемещенный файл появится в результатах:

Теперь вы использовали функцию rename() для перемещения файла из текущего каталога во вложенную папку. Вы также переименовали файл с помощью того же вызова функции.

Заключение

В этой статье вы узнали о различных функциях для управления файлами с помощью Node.js. Сначала вы загрузили содержимое файла с помощью readFile(). Затем вы создали новые файлы и добавили данные в существующий файл с помощью функции writeFile(). Вы безвозвратно удалили файл с помощью функции unlink(), а затем переместили и переименовали файл с помощью rename().

Программная работа с файлами — важная функция Node.js. Программам может потребоваться вывести файлы для использования пользователем или сохранить данные для приложения, которое не всегда запущено. С помощью функций модуля fs разработчики могут контролировать использование файлов в наших программах Node.js.

Чтобы узнать больше о модуле fs, прочтите документацию по Node.js. Если вы хотите продолжить изучение Node.js, вы можете вернуться к серии «Как кодировать в Node.js» или просмотреть проекты и настройки программирования на нашей тематической странице Node.

Хотите узнать больше? Присоединяйтесь к сообществу DigitalOcean!

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

Серия руководств: Как программировать в Node.js

Node.js – это популярная среда выполнения с открытым исходным кодом, которая может выполнять JavaScript вне браузера. Среда выполнения Node обычно используется для внутренней веб-разработки, используя свои асинхронные возможности для создания сетевых приложений и веб-серверов. Node также является популярным выбором для создания инструментов командной строки.

В этой серии вы будете выполнять упражнения, чтобы изучить основы написания кода в Node.js, получая при этом мощные инструменты для серверной и полной разработки.

Читайте также: