🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #27330

Re: biale znaki, jak nie usuwac

#27330
From: Skiner
Date: Fri, 26 Feb 2010 19:56
163 lines
5610 bytes
On 26 Lut, 19:38, "janusz.har...@gmail.com" <janusz.har...@gmail.com>
wrote:
> On Feb 26, 6:23 pm, Skiner <printers.man...@gmail.com> wrote:
>
>
>
> > Witam,
> >  w ramach nauki pythona,napisałem sobie prosty skrypt, który w podanym
> > pliku:
> > dla kazdej lini wyszukuje podciag i zamienia go  na inny:
>
> > dlaprzykładu linia "ab"  jest zamieniana na "abc"  ale juz linia "abc"
> > jest pomijana.
>
> > i tak:
>
> > pobieram linie , robie z niej liste,  sprawdzam kazdy element i ew
> > zamieniam,
>
> > nastepnie zapisuje do innego pliku. Problem w tym,  ze edytuje pliki z
> > kodem zrodlowym,  i  moj sposob pozbawia mnie wszelkich wciec, kazda
> > linia zaczyna się od poczatku wiersza :/  jak to obejsc?
>
> > ponizej fragment kodu( na razie bez zapisu do pliku):
>
> > fp =open('plik.c','r');
> > line1="";
> > while 1:
> >     line =fp.readline();
> >     if line=='': break;
> >     else:
> >       data =line.split();
> >       for i in range(len(data)):
> >         if data[i]=='ab':
> >           data[i]='abc';
> >         line1= "".join(data);
> >         print line1;
> > """ i teraz otwieram nowy plik, zapisuje linia po linii, niestety
> > usuwa biale znaki:/ """
> > fp.close();
>
> > TIA
>
> ok, ale powiedz skąd wziąłeś pomysł na to by właśnie tak kodować?
>
> dobra, po kolei zewnętrzna pętla to "while" a nie lepiej wrzucić od
> razu "for", i kod czytelniejszy i python sam pilnuje by było coś do
> odczytania.
> po drugie, robisz split na stringu - tu tracisz wszelkie informacje,
> które masz - po prostu spacje są tu usuwane i wynikowa tablica
> takowych nie zawiera.
>
> jeżeli chcesz zamienić jeden string na drugi, zrób to używając
> odpowiednich funkcji - dedykowanych.
> np. replace line.replace('ab', 'abc')
> (ten przykład zamienia wystąpienia ab, wszędzie, a nie tylko jako
> wyraz!)
>
> oczywiście jeżeli potrzeba troszeczkę więcej elastyczności - to już
> lepiej użyć modułu re
>
> czyli:
> In [1]: a = '    ab abc ocabcas'
>
> In [2]: a.replace('ab', '123')
> Out[2]: '    123 123c oc123cas'
>
> In [3]: import re
>
> In [4]: re.sub(r'ab', '123', a)
> Out[4]: '    123 123c oc123cas'
>
> In [5]: re.sub(r'\wab\w', '123', a)
> Out[5]: '    ab abc o123as'
>
> następna rzecz, to to, że masz zmienną która cały czas puchnie, przy
> dużym pliku (większym od dostępnej pamięci i swapa) wywali to proces.
> lepiej od razu zapisywać co potrzeba.
>
> czyli taka poprawiona troszeczkę wersja:
>
> import re
> fp =open('plik.c','r')
> fo = open('plik_nowy.c', 'w')
> for line in fp.readlines():
>     fo.write(re.sub(r'\wab\w', 'abc', line)
> fp.close()
> fo.close()
>
> mniejsze, czytelniejsze i pythonowe ;)
>
> p.s.
> średników nie daje się na końcu ;)
>
> p.p.s.
> znaki końca linii (\n) były nietknięte, więc nie trzeba było ich
> nigdzie dodawać.
>
> pozdrawiam,
> J

Dziękuję za odpowiedź,
nie ukrywam, ze to mój pierwszy "skrypt" w Py stąd liczne błędy,

ale wracając do rozwiązania,które zasugerowales, :

mamtaki plik,   niech to bedzie plik index.php,
o następującej tręsci:

<?php echo "HelloWorld" ?>

<? phpinfo();?>
<?php $item =array('test'=>$_GET['ID']); ?>
<? print_r($item)?>
<?

	require_once('conf.php');

?>


i teraz zadaniem jest zaminic short taki"<?" na pełne tagi "<?php"

Twój kod:

#!/usr/bin/env python
import re
fp =open('index.php','r')
fo =open('index_nowy.php', 'w')
for line in fp.readlines():
  fo.write(re.sub(r'\w<?\w', '<php', line))
fo.close()
fp.close()



robi coś takiego:

<?<phpp <php<php "<php<php<php<php<php" ?>

<? <php<php<phpo();?>
<?<phpp $<php<php =<php<phpy('<php<php'=>$<php<php['<php']); ?>
<? <php<php<phpr($<php<php)?>
<?

	<php<php<php<php<php<php('<php<php.<phpp');

?>


A zupełnie, nie o coś takiego chodzi,
stąd  wydawało mi się, że mój sposób jest lepszy, ale
np.  kasuje białe znaki, oraz wysypje się gdy  linia zaczyna się od
"//" znaku komentarza,
bez róznicy czy mowa o C czy PHP.

ijak to obejść,

zagłębiam się w lekture pythona,   starajac sie pisac,  ew.  czytac
manuale,ale jest to dosc rozbudowane


Dziękuję za odpowiedź.
Technical Details
Message-ID: <a77e0555-3217-451f-9ead-fdea74823dce@o3g2000yqb.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!o3g2000yqb.googlegroups.com!not-for-mail
References: <45715cb0-0501-4ece-ac73-a0daa2389b68@m37g2000yqf.googlegroups.com> <5fecbff0-ee66-4d27-9777-4ab708e126c6@e1g2000yqh.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!o3g2000yqb.googlegroups.com!not-for-mail
From: Skiner <printers.manual@gmail.com>
Newsgroups: pl.comp.lang.python
Subject: Re: biale znaki, jak nie usuwac
Date: Fri, 26 Feb 2010 11:56:06 -0800 (PST)
Organization: http://groups.google.com
Lines: 177
Message-ID: <a77e0555-3217-451f-9ead-fdea74823dce@o3g2000yqb.googlegroups.com>
References: <45715cb0-0501-4ece-ac73-a0daa2389b68@m37g2000yqf.googlegroups.com>  <5fecbff0-ee66-4d27-9777-4ab708e126c6@e1g2000yqh.googlegroups.com>
NNTP-Posting-Host: 77.254.9.210
Mime-Version: 1.0
X-Trace: posting.google.com 1267214166 3970 127.0.0.1 (26 Feb 2010 19:56:06 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Fri, 26 Feb 2010 19:56:06 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: o3g2000yqb.googlegroups.com; posting-host=77.254.9.210;  posting-account=j71F4QoAAADT57Qum_ndboIRsnL4AOr8
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.1.8)  Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8,gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit