Article View: pl.comp.lang.python
Article #27329Re: biale znaki, jak nie usuwac
From: janusz.harkot
Date: Fri, 26 Feb 2010 18:38
Date: Fri, 26 Feb 2010 18:38
97 lines
4111 bytes
4111 bytes
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
Technical Details
Message-ID:
<5fecbff0-ee66-4d27-9777-4ab708e126c6@e1g2000yqh.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news-2.dfn.de!news.dfn.de!newsfeed.straub-nv.de!feeder1-2.proxad.net!proxad.net!feeder1-1.proxad.net!198.186.190.251.MISMATCH!news-out.readnews.com!transit4.readnews.com!postnews.google.com!e1g2000yqh.googlegroups.com!not-for-mailReferences:
<45715cb0-0501-4ece-ac73-a0daa2389b68@m37g2000yqf.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news-2.dfn.de!news.dfn.de!newsfeed.straub-nv.de!feeder1-2.proxad.net!proxad.net!feeder1-1.proxad.net!198.186.190.251.MISMATCH!news-out.readnews.com!transit4.readnews.com!postnews.google.com!e1g2000yqh.googlegroups.com!not-for-mail From: "janusz.harkot@gmail.com" <janusz.harkot@gmail.com> Newsgroups: pl.comp.lang.python Subject: Re: biale znaki, jak nie usuwac Date: Fri, 26 Feb 2010 10:38:08 -0800 (PST) Organization: http://groups.google.com Lines: 103 Message-ID: <5fecbff0-ee66-4d27-9777-4ab708e126c6@e1g2000yqh.googlegroups.com> References: <45715cb0-0501-4ece-ac73-a0daa2389b68@m37g2000yqf.googlegroups.com> NNTP-Posting-Host: 83.12.113.70 Mime-Version: 1.0 X-Trace: posting.google.com 1267209488 28769 127.0.0.1 (26 Feb 2010 18:38:08 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Fri, 26 Feb 2010 18:38:08 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: e1g2000yqh.googlegroups.com; posting-host=83.12.113.70; posting-account=TropEQoAAABRACUFZz6cjplyiuqYDlHm User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10,gzip(gfe),gzip(gfe) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit