🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: biale znaki, jak nie usuwac

#27329
From: janusz.harkot
Date: Fri, 26 Feb 2010 18:38
97 lines
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-mail
References: <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