Использовать внешний файл для замены специальных символов? - PullRequest
0 голосов
/ 08 февраля 2012

Мой вопрос может сбивать с толку, но, пожалуйста, извините, я новичок в SO, у меня есть набор названий стран, как показано ниже в таблице sqlite!!

Имена стран

"Америка $"
"Бразилия -"
"'Чехия' '' '"
; Дубай
^^ Англия' '

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

cur.execute ('select replace (заменить (заменить (заменить (@str, '!', ''), '\', ''), '/', ''), '&', '') ')

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

Можете ли вы объяснить мне или пример?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Похоже, вы относительно новичок в Python.Добро пожаловать.Сам я, как говорится, незнакомец здесь.

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

char_cfg = open('9188651a.txt', 'r')
special_chars = char_cfg.readline()
char_cfg.close()

Эти 3 строки открывают текстовый файл для чтения, читают первую строку встрока с именем special_chars, а затем закройте файл cfg, поскольку он нам больше не нужен.Мой файл 9188651a.txt просто выглядит так:

!\/&"-$;^

, он просто содержит символы, которые мы хотим заменить, в произвольном порядке.

Следующие три строки очень похожи, открываявторой файл, содержащий «грязные» названия стран, которые мы должны заменить:

ucountries = open('9188651b.txt', 'r')
list_countries = ucountries.readlines()
ucountries.close()

Обратите внимание на одно ключевое отличие: я использовал метод readlines () вместо readline ().Этот метод читает весь файл и помещает каждую строку в файле как строку в списке.Это может быть очень удобным способом чтения и хранения содержимого многострочного файла.Мой файл 9188651b.txt содержал следующие тестовые данные:

"America$"
"Brazil--"
"Czech"""
;Dubai
^^England"

Я заканчиваю код следующим образом:

countries = open('9188651c.txt', 'w')

for country in list_countries:
    for bad_char in special_chars:
        country = country.replace(bad_char, '')
    countries.write(country)

countries.close()

Первые и последние строки проще всего понять: я открываю третьюфайл, 9188651c.txt для записи моего вывода (обозначается флагом 'w' при вызове метода open ()).Если этот файл еще не существует, Python автоматически создаст его для нас.Я закрываю файл, когда заканчиваю писать в него.Это стандартная практика кодирования на всех языках программирования.

Суть этой программы состоит из четырех строк между ними.

for country in list_countries:

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

for bad_char in special_chars:

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

country = country.replace(bad_char, '')

просто говорит: «Замените все вхожденияbad_char внутри строки страны (которая является одним элементом в списке строк list_countries) с '' или ничего. "Мы сохраняем измененную строку обратно в том же месте в list_countries.

Наконец,

countries.write(country)

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

America
Brazil
Czech
Dubai
England

Справедливое предупреждение, вам вряд ли удастся получить выгоду от таких сомнений очень часто.Люди, которые нашли время ответить, ожидают, что вы нашли время попробовать сами, прежде чем отправлять свой вопрос.Удачи с Python и будьте уверены - Stack Overflow - фантастический ресурс, когда вы научитесь правильно его использовать.

1 голос
/ 08 февраля 2012

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

Возможно, было бы лучше оставить только хорошие символы?

import string
good_characters= string.ascii_letters # a-z, A-Z

тогда там, где приведенный выше ответ имеет

for bad_char in special_chars:
    country = country.replace(bad_char, '')

, вместо этого используйте

country = ''.join(s if s in good_characters else ' ' for s in country).strip()

Совсем не легко следовать, но здесь идет речь:

(s if s in good_characters else ' ' for s in country)

создайте кортеж всех символов в стране (это часть "for s in country"), но используйте букву, если она является буквой, и пробел, если это не так (это "if s в good_character else ''"part)

''.join(...) превращает кортеж обратно в строку

.strip() удаляет лишние пробелы в передней и задней части, которые остаются, заменяя плохие символы пробелами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...