Рубрики
Без рубрики

Мой первый проект Python: как я преобразовал дезорганизованный текстовый файл в аккуратный файл CSV

Автор оригинала: Pranav Shridhar.

Поэтому я решил изучить Python. Оказывается, этот компьютерный программирующий язык не так сложен (ну, пока я не получил этот проект!: P).

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

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

Ну, достаточно сказано о языке. Позвольте мне показать вам, что требовало проект.

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

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

А затем написать их в файл CSV (значения разделения запяты).

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

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

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

1. Формирование регулярного выражения, чтобы соответствовать числу и слово рядом с ним.

Я осмотрел текстовый файл и заметил, что каждая тема (здесь называемая «ключом») имела номер, предшествующий ему номер. Итак, я написал несколько строк кода для создания Regex (регулярное выражение – мощный инструмент для извлечения текста) шаблона следующим образом:

Однако, когда я запустил это, я получил ошибку, UnicodedEcodeError, чтобы быть точной, что означало, что у меня не было доступа к текстовому файлу. Я посмотрел это в https://stackoverflow.com И после долгого поиска без удачи, мой брат пришел и нашел решение. Ошибка была исправлена следующим образом:

Тем не менее, я не получил желаемый выход. Это было потому, что некоторые ключевые ключи были косыми (‘/’) или пробелами (”) в тексте, который мой регельс не мог совпадать. Я думал о улучшении выражения Regex позже и так написал комментарий рядом с ним.

2. Получение списка строк в виде строк из текстового файла

Для этого я написал всего 1 строку кода и к счастью, никаких ошибок не появился.

Тем не менее, я получил нечистый список. Он содержал Newlines (‘\ N’) и пробелы (”), я искал, чтобы уточнить список следующим образом:

3. Извлечение слов, значений и примера предложений отдельно и добавление их в соответствующие списки.

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

Интересно, что поглядывая над текстовым файлом, я заметил больше шаблонов. Каждое слово имело значение в той же линии, разделенной: «знак» и «Пример».

Я думал снова использовать Regex снова. Я нашел альтернативный и более элегантный раствор, нарезав строку (теперь строку в списке) в соответствии с размещением символов. Нарезка – еще одна крутая функция в Python. Я написал код следующим образом:

Приведенный выше код читается почти как английский. Для каждой строки в чистом списке проверяется, имеет ли он: ‘знак. Если это делает, то индекс знака найден, и нарезка выполняется соответственно.

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

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

Для этого я планировал собрать каждое слово, значение и предложение каждого ключа внутри отдельного списка, заключенного другим списком, скажем, список клавиш. Опять же, картинка скажет вам точнее:

Для этого я добавил следующий код, который я написал для нарезки:

Логика этого кода (остальная часть) оказалась неправильной, к сожалению, к сожалению. Я ошибочно предположил, что только 2: ‘) существовал в тексте. Было много исключений, которые я не смог заметить. Я закончил тратить время для отладки возможных ошибок в логике. Я предположил, что полный текстовый файл следил за тем же шаблоном. Но это было просто не так.

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

4. Создание значений для ключей с использованием функции ZIP и распаковки параметров.

На данный момент я не совсем уверен, что я сделаю даже после достижения вышеуказанной конфигурации списков. Я узнал о функции «zip» и «распаковывать параметр» во время одного из технологических переговоров моего брата, который буквально застегнул списки, переданные ему, как и так:

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

Работа вышеуказанного кода можно выяснить, посмотрев на вывод:

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

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

5. Назначение значений к ключам в словаре.

Для этого я пришел к этому решению после некоторых экспериментов с кодом:

Это дало желаемый выход следующим образом:

Программа была почти закончена. Основная проблема лежат в части экстракции данных.

Через часов и часов отладки я вырос все более и более разочарован, почему чертовы не работали. Я позвонил моим брату, и он дал мне тонкий намек на предположения, которые я сделал, определяя условные петли, а если иначе – остальные предложения. Мы изучаем текстовый файл и заметили, что некоторые слова имели примеры в двух строках вместо одного.

Согласно моей логике кода, поскольку нет «:» знак во второй строке (ни AELSE »Part True и выполните код, написанный в нем. Учитывая все это, я изменил код, как показано ниже:

Здесь Hapnumbers () – это функция, которая проверяет, имеет ли в ней данную строчку. Я определил это следующим образом:

Что это делает, так это то, что он собирает вторую строку примера, если все другие условия проваливаются, объединяет его с первой строкой, а затем добавляет его соответствующий список, как и раньше.

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

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

Интересно, что следующее дополнение к Кодексу сообщила, что ошибка произошла по номеру 1750 из строки текстового файла.

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

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

Это хорошо работало до линии 4428 текстового файла, но сбой сразу после. Я проверил этот номер строки на сам текстовый файл, но это не помогло. Тогда я понял, много к моему счастью, что это должно быть последней строкой. Вся программа работала в чистом списке, которая была пустотой в номинальных и пространствах. Я напечатал последнюю строку чистого списка и сравнил его с последней строкой текстового файла. Они подобраны!

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

Поэтому я написал дополнительную строку кода, чтобы покрыть это:

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

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

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

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

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

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

i) Изменение функции «Hapnumbers» для функции «HASNUMBERSDOT» и исключая Regex I, сделанную ранее в программе. Это более эффективно соответствовало ключам, так как у него не было предположений и, следовательно, нет исключения. Код для этого выглядит следующим образом:

II) Замена состояния Regex и кода для получения ключей из чистого списка.

III) сочетание условий «Если» в части «Примеры экстракции»

iv) Материализация кода для задания словарного словаря

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

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

Последняя вещь! Недавно я наткнулся на веселые мема, касающиеся этапов отладки, которая настолько относится к моему опыту, что я не могу противостоять делу. XD

Спасибо за то, что сделали его до конца, пока здесь (даже если вы пропустили большую часть этого, чтобы проверить окончательный результат: P).