PDA

Просмотр полной версии : Нужен несложный парсер.


fasty
19.07.2009, 15:51
Вобщем нужно из такого вида акков:
mail@mail.ru
password
-----------------
Сделать

mail@mail.ru:password


Кто сможет помогите,заранее благодарен.

Fata1ex
19.07.2009, 15:58
Вид файла:

мыло1
пасс1
мыло2
пасс2
?

fasty
19.07.2009, 16:05
мыло1
пасс1

мыло2
пасс2

мыло3
пасс3

mailbrush
19.07.2009, 16:14
<?php

$i = 1;
foreach (file('mails.txt') as $line)
{
$line = trim($line);
if ($line)
{
$i++;
if (!($i % 2))
echo $line;
else
echo ';' . $line . "<br>\r\n";
}
}

?>
Без использования регулярок, прочих функций - только цикл и эхо.

fasty
19.07.2009, 16:26
Спасибо большое.

Fata1ex
19.07.2009, 16:38
Я опоздал :(
Хотя у mailbrush'a, по-моему, что-то не то :)
added: у него все то, просто я кривой :(

#!/usr/bin/env python3

import sys

filename = sys.argv[1]
emails = []
passwords = []
tmp = 1

for line in open(filename):
if line.strip():
emails.append(line.strip()) if tmp % 2 == 1 else passwords.append(line.strip())
tmp += 1

for i in range(len(emails)):
temp = emails[i] + ':' + passwords[i]
print(temp, file = open("out.txt", "a"))

in.txt
lala@mail.ru
password1

coco@mail.ru
password2

kaka@mail.ru
password3

out.txt
lala@mail.ru:password1
coco@mail.ru:password2
kaka@mail.ru:password3

сделал чуть короче (

mailbrush
19.07.2009, 16:41
Fata1ex, мой работает :)
added: не увидел added :)

cupper
19.07.2009, 20:23
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
# Водной файл берем либо из параметра при запуске скрипта, либо по дефолту input.txt
# Запис производиться в файл output.txt
try:
filename = sys.argv[1]
print "Используется файл с данными " + filename,
except IndexError:
print "Испольуется стандартный файл с данными input.txt",
filename="input.txt"

try:
f1 = open(filename, "r")
f2 = open("output.txt", "w")
except IOError:
print "Чёта я файл открыть немогу :("
exit(1)

while 1:
f2.write(f1.readline()[0:-1] + ':' + f1.readline())
print temp,
sNull = f1.readline()
if not sNull:
break

f2.close()
f1.close()

Вход
AdfsdA
222222

BsfsddfB
444444

CgjjjfggdfC
444444

Выход:
AdfsdA:222222
BsfsddfB:444444
CgjjjfggdfC:444444

Чем он лучьше скрипта написанного Fata1ex:
1.
for line in open(filename):
if line.strip():
emails.append(line.strip()) if tmp % 2 == 1 else passwords.append(line.strip())
tmp += 1
Объем используемой оперативки на прямую хависит от объема вхоного файла - это Бэд
2.
for i in range(len(emails)):
temp = emails[i] + ':' + passwords[i]
print(temp, file = open("out.txt", "a"))
Зачем столько раз открывать файл на дозапись ?

PHP незнаю, так что тут молчу.
PS. все сделано исключительно в образовательных целях, и только ради интереса

mailbrush
19.07.2009, 21:49
Ну или самый короткий вариант:<?php

$i = 1;
foreach (file('mails.txt') as $line)
{
$line = trim($line);
if ($line)
{
$i++;
echo $i % 2 ? ';' . $line . "<br>\r\n" : $line;
}
}

?>

login999
19.07.2009, 23:08
cupper, ты не прав насчет первой претензии к фаталексу, он не читает файл в оперативку, конструкция open(filename) не читает файл, а получает хэндлер на него, а когда он делат for line in filehandler то там идет итератор и построчное чтение, так что это пох :D, насчет второго - это маленькие слабости py3k , там поправить -дело пары сек, нужно просто в print передавать хэндлер, но это так лирика :D
И раз уж меряетесь пиписьками, то всуну и я свою кривую реализацию


#! usr/bin/env python
#-*-encoding:cp1251-*-

try:
with open("input.txt") as inpt:
with open("out.txt", "a") as out:
account = {"mail":None,
"password":None}
for line in inpt:
line = line.translate(None, "\r\n")
if not line:
out.write("{0}:{1}\n".format(account["mail"], account["password"]))
account["mail"] = None
account["password"] = None
elif not account["mail"]:
account["mail"] = line
elif not account["password"]:
account["password"] = line
except Exception, e:
print e

на входе input.txt, на выходе будет out.txt
P.S. cupper, понял что смутило в твоем коде - бесконечный цикл

Fata1ex
19.07.2009, 23:13
Эм. Я ни с кем не мерился..и не претендовал на совершенство. Лишь на работоспособность. Так что низачет.

login999
19.07.2009, 23:17
Эм. Я ни с кем не мерился..и не претендовал на совершенство. Лишь на работоспособность. Так что низачет.

Да ладно :)

Я пошутил, хз как назвать когда человеку попросившему написать парсер предлагают 1 реализацию на PHP и две реализации на Python :D

Fata1ex
19.07.2009, 23:20
Я не про тебя, тебе всегда зачет:)

cupper
19.07.2009, 23:31
ты не прав насчет первой претензии к фаталексу
а причем тут хендел файла, я про списокписал
emails.append(line.strip()) ... passwords.append(line.strip()
про то что он весь файл в него сперва загоняет

P.S. cupper, понял что смутило в твоем коде - бесконечный цикл
хороший цикл :), а если чтото насторазивает в нем, то такой цикл взят из учебной литературы. Мне он оч даже приглянулся

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

Fata1ex
19.07.2009, 23:45
Я чаще всего именно так делаю, потому что впоследствии может понадобиться делать с данными что-то еще, тогда код изменить будет легче: пароли и мыла уже считаны в удобном виде и готовы к работе. Сейчас с телефона, утром могу оптимизировать.
И если кто не понял, я согласен, что код не самый удачный и в определенных моментах будет вести себя плохо:(

login999
20.07.2009, 00:34
а причем тут хендел файла, я про списокписал

про то что он весь файл в него сперва загоняет


хороший цикл :), а если чтото насторазивает в нем, то такой цикл взят из учебной литературы. Мне он оч даже приглянулся



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

Ы) Недоглядел, вопросов нет :)
П.С. Девочки не ссорьтесь :D

Fata1ex
20.07.2009, 00:37
Та мы не ссоримся, просто я обидчивая :)

Fata1ex
23.07.2009, 02:52
аааааааа! сорри ) ток сейчас вспомнил, что обещал дописать :)
#!/usr/bin/env python3

tmp = 1

with open(str(input("Enter file name: "))) as fin:
with open("out.txt", "a") as fout:
for line in fin:
if line.strip():
fout.write(line.strip() + ':') if tmp % 2 == 1 else fout.write(line)
tmp += 1

вот :) вроде оптимизировано

сделал меньше еще на строчку :D


ps. cupper, жду замечаний ) с обработкой исключений иди доить корову :D

уменьшил еще на строчку оО )