Article View: pl.comp.lang.python
Article #27331Re: biale znaki, jak nie usuwac
From: Skiner
Date: Fri, 26 Feb 2010 20:12
Date: Fri, 26 Feb 2010 20:12
164 lines
6147 bytes
6147 bytes
On 26 Lut, 20:56, Skiner <printers.man...@gmail.com> wrote:
> 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ź.
I jeszcze jedno,
który tutorial warto "przerobić", w sieci jesttego troche, wiadomo,ze
nie omawiaja wszelkich aspektów, ale od czego zaczac?
Technical Details
Message-ID:
<a9beee51-b95f-4f6d-8c45-e8bb49c8538f@19g2000yqu.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!19g2000yqu.googlegroups.com!not-for-mailReferences:
<45715cb0-0501-4ece-ac73-a0daa2389b68@m37g2000yqf.googlegroups.com> <5fecbff0-ee66-4d27-9777-4ab708e126c6@e1g2000yqh.googlegroups.com> <a77e0555-3217-451f-9ead-fdea74823dce@o3g2000yqb.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!19g2000yqu.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 12:12:57 -0800 (PST) Organization: http://groups.google.com Lines: 177 Message-ID: <a9beee51-b95f-4f6d-8c45-e8bb49c8538f@19g2000yqu.googlegroups.com> References: <45715cb0-0501-4ece-ac73-a0daa2389b68@m37g2000yqf.googlegroups.com> <5fecbff0-ee66-4d27-9777-4ab708e126c6@e1g2000yqh.googlegroups.com> <a77e0555-3217-451f-9ead-fdea74823dce@o3g2000yqb.googlegroups.com> NNTP-Posting-Host: 77.254.9.210 Mime-Version: 1.0 X-Trace: posting.google.com 1267215177 13041 127.0.0.1 (26 Feb 2010 20:12:57 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Fri, 26 Feb 2010 20:12:57 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: 19g2000yqu.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