🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
10 messages
10 total messages Started by Skiner Fri, 26 Feb 2010 17:23
biale znaki, jak nie usuwac
#27327
Author: Skiner
Date: Fri, 26 Feb 2010 17:23
39 lines
2060 bytes
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
Re: biale znaki, jak nie usuwac
#27328
Author: Skiner
Date: Fri, 26 Feb 2010 17:52
44 lines
2652 bytes
On 26 Lut, 18:23, 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

I jeszcze jedna sprawa,
jak wykluczyc w petli  wystepnienie takiej wartosci w liscie "//",
skrypt sie wysypje na takim elemencie listy,
 i np. powiele wiesze,    (  w testowanym pliku dodawął  drugie "}"  )

:/
Re: biale znaki, jak nie usuwac
#27329
Author: 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
Re: biale znaki, jak nie usuwac
#27330
Author: 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ź.
Re: biale znaki, jak nie usuwac
#27331
Author: Skiner
Date: Fri, 26 Feb 2010 20:12
164 lines
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?
Re: biale znaki, jak nie usuwac
#27332
Author: janusz.harkot
Date: Fri, 26 Feb 2010 22:08
20 lines
1875 bytes
a teraz przeanalizuj co napisałeś tutaj:

>   fo.write(re.sub(r'\w<?\w', '<php', line))

znak zapytania jest tutaj interpretowany jako modyfikator regexpa
(http://docs.python.org/library/re.html)

dodaj backslash przed '?' to zadziała:

fo.write(re.sub(r'\w<\?\w', '<php', line))


co do tutoriali, to nie wiem. ale co do książek:
http://diveintopython.org/

i polskie tłumaczenie:
http://pl.wikibooks.org/wiki/Python

J.
Re: biale znaki, jak nie usuwac
#27333
Author: Bart Ogryczak
Date: Mon, 01 Mar 2010 13:24
14 lines
1959 bytes
On Feb 26, 8:56 pm, Skiner <printers.man...@gmail.com> wrote:

> #!/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))

Po pierwsze '?' jest w regexpach znakiem specjalnym, czyli jak chcesz
literał, to musisz poprzedzić \.
Po drugie jeśli wykorzystujesz to samo wyrażenie regularne
wielokrotnie, to warto jest skompilować.
Po trzecie jest opcja re.MULTILINE, więc nie trzeba linia po linii.
Re: biale znaki, jak nie usuwac
#27334
Author: janusz.harkot
Date: Mon, 01 Mar 2010 17:49
24 lines
2482 bytes
On Mar 1, 2:24 pm, Bart Ogryczak <b.ogryc...@gmail.com> wrote:
> On Feb 26, 8:56 pm, Skiner <printers.man...@gmail.com> wrote:
>
> > #!/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))
>
> Po pierwsze '?' jest w regexpach znakiem specjalnym, czyli jak chcesz
> litera³, to musisz poprzedziæ \.
> Po drugie je¶li wykorzystujesz to samo wyra¿enie regularne
> wielokrotnie, to warto jest skompilowaæ.
> Po trzecie jest opcja re.MULTILINE, wiêc nie trzeba linia po linii.

przy większych plikach wczytanie całości do pamięci i puszczanie na
tym regexpa jest zabójcze dla systemu.
mozna kombinować i robić odczyt blokowy (więcej niż jedna linie itp.)
ale imho nie warta skórka za wyprawkę, tak jest prościej i czytelniej
i wiadomo o co chodzi.
można jeszcze (przy pythonie 2.5) użyć xreadlines.

J.
Re: biale znaki, jak nie usuwac
#27335
Author: Bart Ogryczak
Date: Tue, 02 Mar 2010 08:33
24 lines
2506 bytes
On Mar 1, 6:49 pm, "janusz.har...@gmail.com" <janusz.har...@gmail.com>
wrote:
> On Mar 1, 2:24 pm, Bart Ogryczak <b.ogryc...@gmail.com> wrote:
>
> > On Feb 26, 8:56 pm, Skiner <printers.man...@gmail.com> wrote:
>
> > > #!/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))
>
> > Po pierwsze '?' jest w regexpach znakiem specjalnym, czyli jak chcesz
> > litera³, to musisz poprzedziæ \.
> > Po drugie je¶li wykorzystujesz to samo wyra¿enie regularne
> > wielokrotnie, to warto jest skompilowaæ.
> > Po trzecie jest opcja re.MULTILINE, wiêc nie trzeba linia po linii.
>
> przy większych plikach wczytanie całości do pamięci i puszczanie na
> tym regexpa jest zabójcze dla systemu.

Tu mowa o plikach źródłowych, więc nie będzie miał najmniejszego
problemu.
Transaltor 2.6->2.3
#27336
Author: William Bonawentura
Date: Wed, 03 Mar 2010 08:07
3 lines
1196 bytes
Mam potrzebę zainstalowania biblioteki z kodem źródłowym na Pythonie 2.3 
Niestety użyte w kodzie dekoratory @classmetohd trzeba zastąpić "starymi" 
funkcjami zagnieżdżonymi w klasie. Znacie jakiś gotowiec na to ? 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads