<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=%2FCw2</id>
	<title>/Cw2 - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=%2FCw2"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/Cw2&amp;action=history"/>
	<updated>2026-04-24T06:28:55Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=/Cw2&amp;diff=2041&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;= TI:WTBD/Ćwiczenia 2 =  Tutaj zajęliśmy się trochę wykorzystaniem w programach argumentów wywołania przekazanych na linii poleceń. Jest to odrobinę obok za...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=/Cw2&amp;diff=2041&amp;oldid=prev"/>
		<updated>2015-05-23T14:56:03Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;= &lt;a href=&quot;/edu/index.php/TI:WTBD&quot; title=&quot;TI:WTBD&quot;&gt;TI:WTBD&lt;/a&gt;/Ćwiczenia 2 =  Tutaj zajęliśmy się trochę wykorzystaniem w programach argumentów wywołania przekazanych na linii poleceń. Jest to odrobinę obok za...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= [[TI:WTBD]]/Ćwiczenia 2 =&lt;br /&gt;
&lt;br /&gt;
Tutaj zajęliśmy się trochę wykorzystaniem w programach argumentów wywołania przekazanych na linii poleceń. Jest to odrobinę obok zasadniczego tematu, ale rzecz jest przydatna jeżeli chcemy tworzyć narzędzia wielokrotnego użytku, nadające się do udostępnienia komuś innemu niż sam autor.&lt;br /&gt;
&lt;br /&gt;
Pierwszy przykład emuluje częściowo systemowe polecenie ''iconv'' (proszę zajrzeć do manuala). Analizę argumentów wykonujemy &amp;quot;ręcznie&amp;quot;, aby się przekonać, że nie jest to trudne. Identyfikujemy opcje ''-f'' i ''-t'' jako poprzedzające nazwy kodowań: odpowiednio, początkowego i docelowego. Jeśli którakolwiek z tych opcji ''nie'' wystąpi, to nie wiadomo co robić -- więc zgłaszamy błąd i kończymy. Reszta argumentów to nazwy plików do przetworzenia. Wynik posyłamy jednym strumieniem na standardowe wyjście.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
# convtxt0.py&lt;br /&gt;
&lt;br /&gt;
from sys import argv, stdin, stdout, stderr&lt;br /&gt;
&lt;br /&gt;
progname = argv.pop(0)&lt;br /&gt;
args, from_enc, to_enc = list(), None, None&lt;br /&gt;
&lt;br /&gt;
while argv:&lt;br /&gt;
    curr = argv.pop(0)&lt;br /&gt;
    if curr == '-f':&lt;br /&gt;
        from_enc = argv.pop(0)&lt;br /&gt;
    elif curr == '-t':&lt;br /&gt;
        to_enc = argv.pop(0)&lt;br /&gt;
    else:&lt;br /&gt;
        args.append(curr)&lt;br /&gt;
if not (from_enc and to_enc):&lt;br /&gt;
    stderr.write((u'Użycie: %s -f from_enc -t to_enc [plik1 ...]\n' % progname)&lt;br /&gt;
                    .encode('utf-8')&lt;br /&gt;
    )&lt;br /&gt;
    exit(1)&lt;br /&gt;
if args:&lt;br /&gt;
    for f in args:&lt;br /&gt;
        stdout.write(open(f).read().decode(from_enc).encode(to_enc))&lt;br /&gt;
else:&lt;br /&gt;
    stdout.write(stdin.read().decode(from_enc).encode(to_enc))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Słabością tej implementacji jest słabo określone zachowanie, gdy któraś z opcji (''-f'' czy ''-t'') wystąpi w linii poleceń więcej niż raz. Na zdrowy rozum, sens mają dwa rozwiązania: albo uznać to za błąd wywołania, albo pozwolić by ''-f'' występowało wielokrotnie i ''stosowało się do plików, których nazwy występują po tym wystąpieniu -f'' (czyli kolejne pojawienie się tej opcji &amp;quot;przełączałoby&amp;quot; kodowanie wg. którego interpretowana jest zawartość, dla dalszych plików). Zastosowanie tego podejścia do ''-t'' nie miałoby chyba wiele sensu, bo nie ma co mieszać kodowań w ramach jednego strumienia wyjściowego -- więc wielokrotne ''-t'' powinno raczej być błędem.&lt;br /&gt;
&lt;br /&gt;
A jak się zachowuje kod powyżej tak jak stoi? I jak go zmienić, by działał wg. powyższych założeń?&lt;br /&gt;
&lt;br /&gt;
Można też inaczej: skorzystać z &amp;quot;gotowca&amp;quot; dostarczonego w bibliotece standardowej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# coding: utf-8&lt;br /&gt;
&lt;br /&gt;
from sys import argv, stdin, stdout, stderr&lt;br /&gt;
from optparse import OptionParser&lt;br /&gt;
&lt;br /&gt;
parser = OptionParser()&lt;br /&gt;
parser.add_option('-f', '--from', type='string', dest='from_enc')&lt;br /&gt;
parser.add_option('-t', '--to', type='string', dest='to_enc')&lt;br /&gt;
opts, args = parser.parse_args()&lt;br /&gt;
if not opts.from_enc or not opts.to_enc:&lt;br /&gt;
    stderr.write(&lt;br /&gt;
        (u'Wywołanie: %s [-f|--from] kodowanie1 [-t|--to] kodowanie2 [plik1 ...]\n' % argv[0])&lt;br /&gt;
        .encode('utf-8')&lt;br /&gt;
    )&lt;br /&gt;
    exit(1)&lt;br /&gt;
if args:&lt;br /&gt;
    for f in args:&lt;br /&gt;
        stdout.write(open(f).read().decode(opts.from_enc).encode(opts.to_enc))&lt;br /&gt;
else:&lt;br /&gt;
    stdout.write(stdin.read().decode(opts.from_enc).encode(opts.to_enc))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nie jest to może ''dużo'' krótsze, i nie rozwiązuje problemu, o którym mowa powyżej, ale za to daje obsługę tzw. długich nazw opcji (''--from'', ..), nieco większą elastyczność (dopuszcza parę wersji podawania argumentów do opcji), jest też możliwość autogenerowania &amp;quot;helpu&amp;quot; składanego i ładnie formatowanego z opisów, podawanych w wywołaniach ''add_option''. Proszę znaleźć sposób zrobienia tego w dokumentacji i zastosować do powyższego przykładu.&lt;br /&gt;
&lt;br /&gt;
W kolejnym kroku nauczyliśmy się korzystać metody ''translate'' wartości napisowych, na przykładzie programiku, który eliminuje &amp;quot;polskie litery&amp;quot; z danych tekstowych, wymieniając je na ich nieakcentowane odpowiedniki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
# coding: utf-8&lt;br /&gt;
&lt;br /&gt;
_asciify_pl_tab = (u'ĄĆĘŁŃÓŚŻŹąćęłńóśżź', u'ACELNOSZZacelnoszz')&lt;br /&gt;
asciify_pl_tab = dict()&lt;br /&gt;
for a, b in zip(*_asciify_pl_tab):&lt;br /&gt;
  asciify_pl_tab[ord(a)] = b&lt;br /&gt;
  &lt;br /&gt;
#print asciify_pl_tab&lt;br /&gt;
def test(ienc='utf-8', oenc='utf-8'):&lt;br /&gt;
  import fileinput&lt;br /&gt;
  from sys import stdout&lt;br /&gt;
  for line in fileinput.input():&lt;br /&gt;
    stdout.write(line.decode(ienc).translate(asciify_pl_tab).encode(oenc))&lt;br /&gt;
    &lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
  test()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Tablicę&amp;quot; (naprawdę -- słownik) translacji można było oczywiście wprowadzić od razu w postaci literalnego słownika, byłoby to jednak bardziej żmudne i chyba mniej czytelne.&lt;br /&gt;
&lt;br /&gt;
Przy okazji dowiedzieliśmy się o module ''fileinput'', który automatyzuje iterację po linijkach z całego ciągu plików (a nie tylko z jednego).&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>