Fájlműveletek és parancssor

Megmutatjuk, hogy önálló Python scriptek hogyan kezelik a bemeneti paramétereiket és hogyan tudunk fájlokat írni és olvasni

Fájl olvasása

A Python - ahogyan a legtöbb programnyelv - a fájlokat egy fájl objektumon keresztül olvassa és írja. Nézzük meg, hogy hogyan működik!

Az open(filename[, mode]) függvény egy fájlobjektumot ad vissza, ahol a mode lehet 'r' (olvasás), 'w' (írás), 'r+' (mindkettő), vagy bináris fájlokra 'rb', 'wb', 'r+b'.

In [1]:
f = open('E0.csv') # megnyitja olvasasra, visszaad egy file-objektumot
print f
<open file 'E0.csv', mode 'r' at 0x000000000833AC90>

Egyelőre ez csak egy fájl objektum. A mintafájlunk az angol Premier League 2015/16-os idényének a statisztikáit tartalmazza. Most olvassunk is valamit! Az f.read() kiolvassa a fájlt teljes tartalmát egy sztringbe. Nem printeljük ki az egészet, mert túl sok.

In [2]:
f = open('E0.csv')
content = f.read()
print content[:100]
Div,Date,HomeTeam,AwayTeam,FTHG,FTAG,FTR,HTHG,HTAG,HTR,Referee,HS,AS,HST,AST,HF,AF,HC,AC,HY,AY,HR,AR

Olvassuk ki most csak az első sort!

In [3]:
f = open('E0.csv')
first_line = f.readline()
print first_line
second_line = f.readline()
print second_line
Div,Date,HomeTeam,AwayTeam,FTHG,FTAG,FTR,HTHG,HTAG,HTR,Referee,HS,AS,HST,AST,HF,AF,HC,AC,HY,AY,HR,AR,B365H,B365D,B365A,BWH,BWD,BWA,IWH,IWD,IWA,LBH,LBD,LBA,PSH,PSD,PSA,WHH,WHD,WHA,VCH,VCD,VCA,Bb1X2,BbMxH,BbAvH,BbMxD,BbAvD,BbMxA,BbAvA,BbOU,BbMx>2.5,BbAv>2.5,BbMx<2.5,BbAv<2.5,BbAH,BbAHh,BbMxAHH,BbAvAHH,BbMxAHA,BbAvAHA,PSCH,PSCD,PSCA

E0,13/08/16,Burnley,Swansea,0,1,A,0,0,D,J Moss,10,17,3,9,10,14,7,4,3,2,0,0,2.4,3.3,3.25,2.45,3.1,2.95,2.5,3.3,2.65,2.45,3.25,3.1,2.47,3.32,3.19,2.5,3.2,2.9,2.5,3.2,3.25,55,2.55,2.43,3.35,3.21,3.3,3.1,40,2.4,2.3,1.68,1.61,32,-0.25,2.13,2.06,1.86,1.81,2.79,3.16,2.89

Ez még mindig nagyon fárasztó. De szerencsére a fájl objektum iterálható, soronként.

Figyeljük meg, hogy újsor karakter van minden sor végén.

In [4]:
f = open('E0.csv')
L = []
for line in f:
    L.append(line)
print L[:10]
['Div,Date,HomeTeam,AwayTeam,FTHG,FTAG,FTR,HTHG,HTAG,HTR,Referee,HS,AS,HST,AST,HF,AF,HC,AC,HY,AY,HR,AR,B365H,B365D,B365A,BWH,BWD,BWA,IWH,IWD,IWA,LBH,LBD,LBA,PSH,PSD,PSA,WHH,WHD,WHA,VCH,VCD,VCA,Bb1X2,BbMxH,BbAvH,BbMxD,BbAvD,BbMxA,BbAvA,BbOU,BbMx>2.5,BbAv>2.5,BbMx<2.5,BbAv<2.5,BbAH,BbAHh,BbMxAHH,BbAvAHH,BbMxAHA,BbAvAHA,PSCH,PSCD,PSCA\n', 'E0,13/08/16,Burnley,Swansea,0,1,A,0,0,D,J Moss,10,17,3,9,10,14,7,4,3,2,0,0,2.4,3.3,3.25,2.45,3.1,2.95,2.5,3.3,2.65,2.45,3.25,3.1,2.47,3.32,3.19,2.5,3.2,2.9,2.5,3.2,3.25,55,2.55,2.43,3.35,3.21,3.3,3.1,40,2.4,2.3,1.68,1.61,32,-0.25,2.13,2.06,1.86,1.81,2.79,3.16,2.89\n', 'E0,13/08/16,Crystal Palace,West Brom,0,1,A,0,0,D,C Pawson,14,13,4,3,12,15,3,6,2,2,0,0,2,3.3,4.5,2,3.2,3.9,2.1,3.3,3.3,2,3.25,4.33,2.06,3.29,4.32,2.05,3.1,4,2,3.3,4.4,56,2.1,2.01,3.4,3.23,4.5,4.16,38,2.68,2.5,1.6,1.52,33,-0.5,2.07,2,1.9,1.85,2.25,3.15,3.86\n', 'E0,13/08/16,Everton,Tottenham,1,1,D,1,0,H,M Atkinson,12,13,6,4,10,14,5,6,0,0,0,0,3.2,3.4,2.4,2.95,3.2,2.4,2.65,3.3,2.5,3.1,3.4,2.4,3.25,3.43,2.37,3.1,3.1,2.4,3.25,3.4,2.38,55,3.3,3.12,3.45,3.32,2.5,2.36,41,2.12,2.05,1.87,1.77,32,0.25,1.91,1.85,2.09,2,3.64,3.54,2.16\n', 'E0,13/08/16,Hull,Leicester,2,1,H,1,0,H,M Dean,14,18,5,5,8,17,5,3,2,2,0,0,4.5,3.6,1.91,4.33,3.4,1.9,3.3,3.3,2.1,4.5,3.5,1.91,4.43,3.55,1.95,4.2,3.25,1.95,4.4,3.5,1.95,55,4.5,4.17,3.6,3.43,2.33,1.95,40,2.3,2.19,1.74,1.67,31,0.25,2.35,2.26,2.03,1.67,4.68,3.5,1.92\n', 'E0,13/08/16,Man City,Sunderland,2,1,H,1,0,H,R Madley,16,7,4,3,11,14,9,6,1,2,0,0,1.25,6.5,15,1.22,6,11.5,1.25,5.5,10.3,1.25,6.5,13,1.27,6.48,13.15,1.25,5.5,13,1.25,6.5,15,56,1.3,1.25,6.8,6.11,15,12.55,39,1.56,1.53,2.67,2.48,34,-1.5,1.81,1.73,2.2,2.14,1.25,6.5,14.5\n', 'E0,13/08/16,Middlesbrough,Stoke,1,1,D,1,0,H,K Friend,12,12,2,1,18,14,9,6,3,5,0,0,2.38,3.2,3.4,2.25,3.1,3.25,2.3,3.3,2.9,2.3,3.2,3.4,2.33,3.24,3.53,2.4,3.1,3.1,2.38,3.2,3.4,56,2.4,2.31,3.3,3.16,3.65,3.38,38,2.61,2.46,1.57,1.53,32,-0.25,1.99,1.93,1.97,1.92,2.2,3.38,3.7\n', 'E0,13/08/16,Southampton,Watford,1,1,D,0,1,A,R East,24,5,6,1,8,12,6,2,1,2,0,1,1.8,3.75,5,1.8,3.4,4.5,1.8,3.5,4.2,1.8,3.6,5,1.88,3.68,4.64,1.83,3.4,4.5,1.83,3.6,5,56,1.88,1.82,3.8,3.56,5,4.62,42,2.13,2.06,1.83,1.75,33,-0.75,2.16,2.07,1.89,1.8,1.8,3.83,4.91\n', 'E0,14/08/16,Arsenal,Liverpool,3,4,A,1,1,D,M Oliver,9,16,5,7,13,17,5,4,3,3,0,0,2.4,3.5,3.1,2.35,3.3,2.9,2.3,3.3,2.9,2.38,3.4,3.1,2.41,3.53,3.1,2.5,3.1,3,2.4,3.5,3.1,55,2.5,2.36,3.55,3.42,3.2,3.04,42,1.98,1.81,2.09,1.99,31,-0.5,2.41,2.31,1.81,1.64,2.8,3.44,2.68\n', 'E0,14/08/16,Bournemouth,Man United,1,3,A,0,1,A,A Marriner,9,11,3,7,7,10,4,2,0,1,0,0,4.75,3.6,1.85,4.6,3.5,1.75,4.5,3.5,1.75,4.8,3.6,1.8,4.7,3.62,1.88,4.5,3.4,1.85,4.75,3.6,1.87,55,5,4.5,3.75,3.51,1.95,1.86,42,2.11,2.05,1.87,1.76,33,0.75,1.8,1.76,2.17,2.11,5.4,3.65,1.78\n']

Az L lista a fájl sorait tartalmazza. A sorokat .split(",")-tel cellákká is tudjuk tördelni, de erről mindjárt részletesebben.

Fájl írása

Képzeljük el, hogy Liverpool szurkolók vagyunk és nekünk csak a kedvenc csapatunk eredményei számítanak. Írjuk ki egy fájlba őket! Az olvasáshoz hasonlóan szükségünk lesz egy fájl objektumra, de ahhoz, hogy írni tudjuk, másként kell megnyitni. Először egy egyszerű példa. Az open(filename, 'w') írásra nyitja meg a fájlt, de ha írunk, vigyázzunk, hogy zárjuk is be!

In [5]:
f = open('Liverpool.csv', 'w')
f.write('YNWA')
f.close()

Megjegyzés: szöveges fájl olvasásához az open('E0.csv', 'r') parancsot használjuk, de alapértelmezésben olvasásra nyitunk meg egy fájlt, ezért az r elhagyható.

Térjünk vissza az eredeti példához! Soronként beolvassuk a fájlt, és azt a sort, ahol a Liverpool szerepel, elmentjük. Ne felejtsük el, hogy a fejlécre továbbra is szükségünk van!

In [6]:
f = open('E0.csv')
L = [f.readline()]
for line in f:
    if 'Liverpool' in line:
        L.append(line)
with open('Liverpool.csv', 'w') as f:
    for l in L:
        f.write(l)
f.close()

Figyeljük meg, hogy a write metódus nem tesz automatikusan újsort a kiírandó szöveg végére, manuálisan kell az újsor karaterről gondoskodni.

A with open(filename, 'r') as f pontosan ugyanahhoz az eredményhez vezet mintha f = open(filename, 'r')-t írtunk volna, de a block végén a fájlt be is zárja, így pontosan lehet szabályozni, hogy (legfeljebb) meddig álljon nyitva a fájl. Ez írásnál (is) garantálja, hogy ne maradjon nyitva a fájl.

Ha lehet, használjuk az előbbit, így pontosan látjuk, meddig olvassuk a fájlunkat és biztonságosabb a fájl korrupcióval szemben is (adat-meghibásodás)!

csv és json python-ban

Az előző fájl .csv kiterjesztése a comma separated values-ra utal. Az ilyen fájlokban egy sorban egy rekord szerepel, a rekordok adatait pedig vesszővel -- választhatunk más karaktert pl. tab, pontosvessző stb. -- választjuk el. Pythonnal könnyű kezelni az ilyen fájlokat. Erre való a csv modul.

In [7]:
import csv
L=[]
with open('E0.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        L.append(row)
print L[0]
print L[19]
['Div', 'Date', 'HomeTeam', 'AwayTeam', 'FTHG', 'FTAG', 'FTR', 'HTHG', 'HTAG', 'HTR', 'Referee', 'HS', 'AS', 'HST', 'AST', 'HF', 'AF', 'HC', 'AC', 'HY', 'AY', 'HR', 'AR', 'B365H', 'B365D', 'B365A', 'BWH', 'BWD', 'BWA', 'IWH', 'IWD', 'IWA', 'LBH', 'LBD', 'LBA', 'PSH', 'PSD', 'PSA', 'WHH', 'WHD', 'WHA', 'VCH', 'VCD', 'VCA', 'Bb1X2', 'BbMxH', 'BbAvH', 'BbMxD', 'BbAvD', 'BbMxA', 'BbAvA', 'BbOU', 'BbMx>2.5', 'BbAv>2.5', 'BbMx<2.5', 'BbAv<2.5', 'BbAH', 'BbAHh', 'BbMxAHH', 'BbAvAHH', 'BbMxAHA', 'BbAvAHA', 'PSCH', 'PSCD', 'PSCA']
['E0', '21/08/16', 'Sunderland', 'Middlesbrough', '1', '2', 'A', '0', '2', 'A', 'M Atkinson', '18', '8', '5', '3', '11', '14', '8', '1', '1', '1', '0', '0', '2.55', '3.2', '3.1', '2.5', '3.1', '3.1', '2.3', '3.2', '3', '2.5', '3.2', '3.1', '2.61', '3.22', '3.06', '2.6', '3.2', '2.75', '2.63', '3.13', '3.1', '56', '2.64', '2.52', '3.25', '3.16', '3.25', '3.02', '39', '2.5', '2.38', '1.64', '1.57', '33', '-0.25', '2.21', '2.14', '1.8', '1.75', '2.79', '3.1', '2.94']

A különbség szembetűnő. A csv.reader egyből listát csinál nekünk a sorokból. Ráadásul megadhatjuk neki az elválasztó karaktert, valamint a quotechar-t is, ami az idézőjel karaktert jelöli ki. Ez azért fontos néhány esetben, mert sokszor számok és sztringek vegyesen vannak egy csv fájlban, ilyenkor a sztringeket idézőjelbe szokták tenni, amit a csv modul felismer és nem nekünk kell foglalkozni vele.

.csv fájlt binárisként nyissuk meg (rb/wb), a csv modul így fogja jól kezelni. Általában nem baj ha mindig (szövegfájlt is) binárisként kezelünk, fordítva lehet nagyobb probléma, de bővebben a sorvége karakterről. Ez az oprendszerek eltérő sorvége kezelése miatt alakult így.

csv olvasása szótárba

Ha jól megnézzük az adatokat, nekünk nem feltétlenül listákra lenne szükségünk, hanem szótárakra. A fájl ugyanis minden meccsre ugyanazokat az adatokat tárolja, mi pedig szívesebben hivatkozunk indexek helyett nevekkel dolgokra. Erre is van lehetőség.

In [8]:
import csv
L=[]
with open('E0.csv', 'rb') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        L.append(row)
print L[0]
print L[1]
{'BbAHh': '-0.25', 'HY': '3', 'BbMx>2.5': '2.4', 'HTHG': '0', 'HR': '0', 'HS': '10', 'VCA': '3.25', 'BbMxD': '3.35', 'AwayTeam': 'Swansea', 'BbAvD': '3.21', 'PSD': '3.32', 'BbAvA': '3.1', 'HC': '7', 'HF': '10', 'Bb1X2': '55', 'BbAvH': '2.43', 'WHD': '3.2', 'Referee': 'J Moss', 'WHH': '2.5', 'WHA': '2.9', 'IWA': '2.65', 'AST': '9', 'BbMxH': '2.55', 'HTAG': '0', 'PSCH': '2.79', 'BbAv>2.5': '2.3', 'IWH': '2.5', 'LBA': '3.1', 'BWA': '2.95', 'BWD': '3.1', 'LBD': '3.25', 'HST': '3', 'PSA': '3.19', 'Date': '13/08/16', 'LBH': '2.45', 'BbMxAHA': '1.86', 'BbAvAHA': '1.81', 'BbAvAHH': '2.06', 'IWD': '3.3', 'AC': '4', 'FTR': 'A', 'VCD': '3.2', 'AF': '14', 'VCH': '2.5', 'FTHG': '0', 'BWH': '2.45', 'AS': '17', 'AR': '0', 'AY': '2', 'Div': 'E0', 'PSH': '2.47', 'B365H': '2.4', 'HomeTeam': 'Burnley', 'B365D': '3.3', 'B365A': '3.25', 'BbMx<2.5': '1.68', 'BbMxAHH': '2.13', 'BbAv<2.5': '1.61', 'HTR': 'D', 'BbAH': '32', 'BbOU': '40', 'FTAG': '1', 'PSCA': '2.89', 'PSCD': '3.16', 'BbMxA': '3.3'}
{'BbAHh': '-0.5', 'HY': '2', 'BbMx>2.5': '2.68', 'HTHG': '0', 'HR': '0', 'HS': '14', 'VCA': '4.4', 'BbMxD': '3.4', 'AwayTeam': 'West Brom', 'BbAvD': '3.23', 'PSD': '3.29', 'BbAvA': '4.16', 'HC': '3', 'HF': '12', 'Bb1X2': '56', 'BbAvH': '2.01', 'WHD': '3.1', 'Referee': 'C Pawson', 'WHH': '2.05', 'WHA': '4', 'IWA': '3.3', 'AST': '3', 'BbMxH': '2.1', 'HTAG': '0', 'PSCH': '2.25', 'BbAv>2.5': '2.5', 'IWH': '2.1', 'LBA': '4.33', 'BWA': '3.9', 'BWD': '3.2', 'LBD': '3.25', 'HST': '4', 'PSA': '4.32', 'Date': '13/08/16', 'LBH': '2', 'BbMxAHA': '1.9', 'BbAvAHA': '1.85', 'BbAvAHH': '2', 'IWD': '3.3', 'AC': '6', 'FTR': 'A', 'VCD': '3.3', 'AF': '15', 'VCH': '2', 'FTHG': '0', 'BWH': '2', 'AS': '13', 'AR': '0', 'AY': '2', 'Div': 'E0', 'PSH': '2.06', 'B365H': '2', 'HomeTeam': 'Crystal Palace', 'B365D': '3.3', 'B365A': '4.5', 'BbMx<2.5': '1.6', 'BbMxAHH': '2.07', 'BbAv<2.5': '1.52', 'HTR': 'D', 'BbAH': '33', 'BbOU': '38', 'FTAG': '1', 'PSCA': '3.86', 'PSCD': '3.15', 'BbMxA': '4.5'}

Tároljuk most el a Liverpool mérkőzéseinek legfontosabb adatait. Ezek a 'Date', 'HomeTeam', 'AwayTeam', 'FTHG'(Full Time Home Goals), 'FTAG' (Full Time Away Goals), 'FTR' (Full Time Result)! A tároláshoz a csv.DictWriter lesz segítségünkre. a writer.writeheader() a fejlécet írja ki fájlba, a writer.writerows() pedig egy mozdulattal kiírja az összes adatunkat. A fieldnames paraméterben adhatjuk meg, hogy milyen attribútumokra van szükségünk, az extrasaction='ignore' pedig pusztán azért kell, hogy a többi adatot ne írja bele.

In [9]:
import csv
L=[]
with open('E0.csv', 'rb') as csvfile:
    reader = csv.DictReader(csvfile)
    for x in reader:
        if x['HomeTeam'] == 'Liverpool' or x['AwayTeam'] == 'Liverpool':
            L.append(x)
csvfile.close()
with open('Liverpool.csv', 'wb') as output:
    fields = ['Date', 'HomeTeam', 'AwayTeam', 'FTHG', 'FTAG', 'FTR']
    writer = csv.DictWriter(output, fieldnames=fields, extrasaction='ignore')
    writer.writeheader()
    writer.writerows(L)
output.close()

A json formátum

JavaScript Object Notation

Tárolhatunk benne számokat, sztringeket, listát, szótárat. Sőt, tetszőlegesen egymásba ágyazhatunk szótárakat, listákat, listák listáját, szótárak listáját, szótárak szótárát, listák szótárát. Listák elemeit vesszővel választjuk el, a szótárakat pedig mint a Pythonban key:value módon adjuk meg.

{
    "Liverpool" : {
        "Players": [
            "Steven Gerrard",
            "Bill Shankly"
        ],
        "Results" : [
            {
                "HomeTeam":"Liverpool",
                "AwayTeam":"Tottenham",
                "HTG":1,
                "ATG":1
            },
            {
                "HomeTeam":"West Ham",
                "AwayTeam":"Liverpool",
                "HTG":2,
                "ATG":0
            }
        ],
        "Points":1,
        "Goals Scored":1,
        "Goals Condceded":3
    }
}

Természetesen a Pythonnal a json-t is kényelmesen lehet kezelni. Egyszerűen beolvassuk a fájlt és kiírjuk a képernyőre. Látjuk, hogy Python szótár keletkezett belőle, tehát hivatkozhatunk a kulcsaira. Az u'Steven Gerrard' azt jelenti, hogy unicode sztringet olvastunk be (karakterkódolás).

In [10]:
import json
with open('Liverpool.json') as data_file:    
    data = json.load(data_file)

print data
print data['Liverpool']['Players']
{u'Liverpool': {u'Players': [u'Steven Gerrard', u'Bill Shankly'], u'Goals Scored': 1, u'Points': 1, u'Goals Condceded': 3, u'Results': [{u'HTG': 1, u'AwayTeam': u'Tottenham', u'HomeTeam': u'Liverpool', u'ATG': 1}, {u'HTG': 2, u'AwayTeam': u'Liverpool', u'HomeTeam': u'West Ham', u'ATG': 0}]}}
[u'Steven Gerrard', u'Bill Shankly']

Írjuk ki egy fájlba a meccsek eredményeit! A külalakra is figyelünk, erre való a sort_keys, az indent és a separators. A json.dumps(obj) tetszőleges Python objectet json sztringgé alakít, így ezt egyszerűen kiírjuk a fájlba!

In [11]:
import json
with open('Liverpool.json') as data_file:    
    data = json.load(data_file)
data_file.close()
with open('Liverpool_matches.json', 'wb') as f:
    f.write(json.dumps(data['Liverpool']['Results'], 
            sort_keys=True, indent=4, separators=(',', ': ')))

json.dump(JSON_formaju_szoveg, file): kiírás fájlba
json.dumps(objektum): objektum JSON formátumúvá konvertálása
json.load(file): a file-ban lévő JSON formátumú dokumentumot Python objektummá konvertál
json.loads(JSON_formaju_szoveg): JSON formátumú dokumentumot Python objektummá konvertál
Részletek a https://docs.python.org/2/library/json.html.

Parancssori (command line) argumentumok

Szeretnénk a Python programunknak kívülről átadni paraméterértékeket!

A sys csomag

Elmentünk .py végződéssel egy fájlt. Ezt vagy a rendszer felismeri mint Python scriptet vagy megfelelő paranccsal indítjuk. Első programunkkal kiírjuk a bemeneti paraméterek számát és listáját. Az első elem mindig a script neve. A paramétereket a sys.argv listában tárolja a Python. Ehhez kell az import sys csomag betöltése. Minden argumentum karakterlánc (list of str).

A következő kódot írjuk ki egy fájlba, és futassuk parancssorból a megfelelő paranccsal.

import sys

print 'Az argumentumok szama: ', len(sys.argv)
print 'Az argumentumok listaja:', str(sys.argv)
In [12]:
! python parancssori.py arg1 arg2
Az argumentumok szama: 3
Az argumentumok listaja: ['parancssori.py', 'arg1', 'arg2']

A ! jelzi, hogy azt a cellát parancssorba futtassa a notebook.

Az ilyen paramétereket hívjuk pozicionális paramétereknek, hiszen a sys.argv listában elfoglalt helyük alapján azonosítjük őket.

Feladat: emeljünk egy számot adott hatványra! Ha az alap és a kitevő is egész, akkor számoljuk a hatványt egészek hatványaként, különben lebegőpontosként. A két számot parancssori argumentumként adjuk át a programnak.

A következő kódot másoljuk egy fájlba és parancssorból futtassuk!

import sys

def is_intstring(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

a = []

for i in range(1,3):
    if is_intstring(sys.argv[i]):
        a.append(int(sys.argv[i]))
    else:
        a.append(float(sys.argv[i]))

print a[0] ** a[1]

A futtatások eredményei:

In [13]:
! python hatvany.py 4.2 3

!python hatvany.py 2 100
74.088
1267650600228229401496703205376

argparse

A sys.argv tömböt is feldolgozhatjuk, de ezt is megtette helyettünk már valaki. Az argparse modul segít nekünk egészen összetett parancssori argumentumok beolvasásában is. Nézzünk példát egy flag-re. Ezek kvázi kétállapotú kapcsolók, amelyek befolyásolják a kód működését, nézzünk egy példát a verbosity-re. Ha a felhasználó szeretné, követheti a lépéseket.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
print type(args.verbosity)
if args.verbosity:
    print "verbosity turned on"
else:
    print "verbosity turned off"
In [14]:
!python parser.py --verbosity 1
<type 'str'>
verbosity turned on
In [15]:
!python parser.py
<type 'NoneType'>
verbosity turned off

Ez minden egész értéket elfogad a --verbosity után. Még ennél is elegánsabb az action='store_true'. Most ráadásul elég csak -v-vel meghívni

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true")
args = parser.parse_args()
print type(args.verbose)
if args.verbose:
    print "verbosity turned on"
else:
    print "verbosity turned off"
In [16]:
!python parser2.py
!python parser2.py --verbose
!python parser2.py -v
<type 'bool'>
verbosity turned off
<type 'bool'>
verbosity turned on
<type 'bool'>
verbosity turned on

Sőt, a help menü automatikusan elkészül. Ehhez kellett a help="increase output verbosity".

In [17]:
!python parser2.py --help
usage: parser2.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity

Vissza a csv fájlunkhoz. Szeretnénk megtudni, hogy egy adott csapatnak hány olyan mérkőzése volt, amelyen legalább x gólt rúgott. A csapat nevét és a gólok számát is olvassuk be a parancssorból! Az action='store' az args szótár megdelelő kulcsához társítja az értéket, a type pedig meghatározza a típusát. Megjegyezzük, hogy ezek az argumentumok opcionálisak, így nem árt, ha alapértelmezett értéke is van (default).

import argparse
import csv

parser = argparse.ArgumentParser()
parser.add_argument("-t", "--team", help="The team we are looking for", action="store", type=str, default='Liverpool')
parser.add_argument("-g", "--goals", help="Number of minimum goals scored", action="store", type=float, default=0)
args = parser.parse_args()

m = 0
team = args.team
goals = args.goals
with open('E0.csv', 'rb') as csvfile:
    reader = csv.DictReader(csvfile)
    for x in reader:
        if x['HomeTeam'] == team and float(x['FTHG']) >= goals:
            m += 1
        elif x['AwayTeam'] == team and float(x['FTAG']) >= goals:
            m += 1
print m
In [18]:
!python goals.py -h
usage: goals.py [-h] [-t TEAM] [-g GOALS]

optional arguments:
  -h, --help            show this help message and exit
  -t TEAM, --team TEAM  The team we are looking for
  -g GOALS, --goals GOALS
                        Number of minimum goals scored
In [19]:
!python goals.py -g 1
33