Расщепление одной линии на несколько из них дали сепаратор


У меня есть файл, содержащий одну строку:

"name surname" <name.surname@example.com>, 'name surname' <name.surname@example.com>, name surname <name.surname@example.com>, "'name surname'" <name.surname@example.com>, surname, <name.surname@example.com>, name <name.surname@example.com>

Отметим, что это 6 разных форм.

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

import sys

ifile = sys.argv[1]
ofile = sys.argv[2]

with open(ifile) as ifile, open(ofile, "w") as ofile:
    addresses = ifile.readline().split(">,")
    for n, address in enumerate(addresses):
        address = address.replace("'", "")
        address = address.replace('"', "")
        name, address = address.split("<")
        address = "<" + address
        if len(name) > 1:
            name = name.strip()
            name = '"{}" '.format(name)
            address = "".join(name + address)
        if n < len(addresses) - 1:
            ofile.write(address.strip() + ">\n")
        else:
            ofile.write(address.strip() + "\n")

А мне кажется, шаманства и я ищу лучшее решение.



5286
1
задан 20 июня 2011 в 09:06 Источник Поделиться
Комментарии
1 ответ

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

И зачем вы снимаете скобки и поставив их обратно?

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

import sys

ifile = sys.argv[1]
ofile = sys.argv[2]

with open(ifile) as ifile, open(ofile, "w") as ofile:
for address in ifile.readline().split(","):
ofile.write(address.strip() + '\n')

Обновление:

"фамилия, имя " хреново, и это означает, что ваш формат является необоснованной и не для анализа без ужасных хаков. В этом случае ваш код выглядит ок, хотя я бы, наверное, делают это по-разному. Я бы скорее использовать регулярное выражение, чтобы найти все случаи запятые, которым не предшествуют > и Пробел на что-то другое, скажем ЧР(128) или что-то подобное. Тогда я бы парсить код с моим выше код, извлечь письмо из жгутов кронштейны, прокладки все кавычки и скобки от remander, и заменить обратно хр(128) запятыми.

И, наконец, пишут, что в выходной_файл.

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

Обновление 2:

Вместо этого Я заменил запятые, которые должны быть разделены на, что делает его проще, вот так:

import sys

ifile = sys.argv[1]
ofile = sys.argv[2]

with open(ifile) as ifile, open(ofile, "w") as ofile:
data = ifile.read()
data = data.replace('>,', '>\xF0')
for line in data.split('\xF0'):
name, email = line.split('<')
email = email.replace('>', '').strip()
name = name.replace('"', '').replace("'", "").strip()
ofile.write('"%s" <%s>\n' % (name, email))

и тогда я понял, я мог бы упростить его еще больше:

import sys

ifile = sys.argv[1]
ofile = sys.argv[2]

with open(ifile) as ifile, open(ofile, "w") as ofile:
data = ifile.read()
for line in data.split('>,'):
name, email = line.split('<')
email = email.strip()
name = name.replace('"', '').replace("'", "").strip()
ofile.write('"%s" <%s>\n' % (name, email))

И в этот момент я в основном делаю то, что вы делаете, но значительно упрощенный.

2
ответ дан 20 июня 2011 в 10:06 Источник Поделиться