2019-03-04
Python ma całe mnóstwo modułów, które pozwalają na wykonywanie prawie wszystkich operacji (no bez przesady, ale sporo można zrobić)!
Mamy moduł:
- requests – do wykonywania operacji na stronach webowych
- gzip lub zip – do kompresji plików (lub ogólniej danych)
- io – do wykonywania operacji wejścia wyjścia
- pandas – do przetwarzania danych
Jeśli dobrze się postarać można ze sobą połączyć te moduły i… pobrać plik, rozkompresować go i zaimportować do obiektu data frame!
Tutaj pobierzemy jeden z plików publikowanych na stronie EuroStat:
https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&dir=data
import pandas as pd
import requests, gzip, io
url = 'https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=data%2Faact_ali01.tsv.gz'
downloaded_file = requests.get(url)
unzipped_content = gzip.open(io.BytesIO(downloaded_file.content))
df = pd.read_csv(unzipped_content, delimiter='\t')
df.head()
w zależności od upodobań polecenie można skrócić:
import pandas as pd
import requests, gzip, io
url = 'https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=data%2Faact_ali01.tsv.gz'
with gzip.open(io.BytesIO(requests.get(url).content)) as unzipped_content:
df = pd.read_csv(unzipped_content, delimiter='\t')
df.head()
2019-03-04
MSDTC to jedna z usług, o której… lepiej nie słyszeć, bo jeśli o niej nie słyszysz, to znaczy, że wszystko działa, a jak już ktoś coś o niej powie, to często zaczyna się szukanie igły w stogu siana. Na szczęście konfiguracja usługi nie jest aż tak bardzo kłopotliwa.
Ta opowieść zaczyna się od kontaktu ze strony administratora, który stwierdził, że jego aplikacja nie łączy się do MS Distributed Transaction Coordinator-a.
Oczywiście należy zacząć od sprawdzenia czy usługa MSDTC w ogóle działa! Jeśli akcja działaby się na pojedyńczym serwerze wystarczyłoby przejrzeć usługi. W przypadku clustra, MSDTC jest zwykle konfigurowane jako usługa roli clustra:
Get-ClusterResource | where {$_.ResourceType -eq 'Distributed Transaction Coordinator'}
Name State OwnerGroup ResourceType
---- ----- ---------- ------------
New Distributed Transaction Coordinator Online SERVER_00123 Distributed Transaction Coordinator
Status online świadczy o tym, że usługa działa.
Kolejny pomysł to oczywiście pozamykane porty. Połączenie z MSDTC zaczyna się na porcie 135, a potem jest losowany port z zakresu 1024 do 65525. Po stronie serwera zazwyczaj istnieją już odpowiednie reguły w definicji firewall, wystarczy je włączyć.
To polecenie wyświetla reguły, które mają coś wspólnego z „distributed” lub „DTC”: Czytaj dalej »
2019-02-28
Po wpisaniu: „python -V” wyświetla się „NameError: name 'Python’ is not defined”
To jest mniej problem z Pythonem, a bardziej z konfiguracja systemu operacyjnego. Kiedy uruchamiasz polecenie, to system operacyjny musi je odnaleźć na dysku. System operacyjny nie przegląda za każdym razem wszystkich katalogów żeby znaleźć jeden prasujący program. W systemie operacyjnym jest zdefiniowana zmienna środowiskowa o nazwie PATH, która zawiera w sobie wszystkie katalogi, które w tej sytuacji mają być przeszukane.
Podczas instalacji, już na pierwszym ekranie pada pytanie, czy instalator ma dodać Python do ścieżki

Czytaj dalej »
2019-02-28
W skryptach PowerShell można korzystać ze zmiennych lokalnych (widocznych wewnątrz funkcji), zmiennych skryptu (widocznych w skrypcie) i zmiennych globalnych (widoczne wszędzie). Popatrz na taki przykład:
function Show-Variable()
{
echo "Inside the function: $MyVar"
$MyVar='BLUE'
}
$MyVar = 'GREEN'
echo "Outside the function: $MyVar"
Show-Variable
echo "Outside the function: $MyVar"
Jest tutaj funkcja, która wyświetla wartość zmiennej zdefiniowanej początkowo na poziomie skryptu. Pytanie, czy ta zmienna będzie widoczna dla funkcji i czy rzeczywiście uda się ją zmienić? Czytaj dalej »
2019-02-26
Mamy niby proste polecenie:
ls -Recurse C:\Users\admin\Documents\|
Select-Object Name,CreationTime |
Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")}
Niestety nic nie jest wyświetlane, a na pewno w tym katalogu są pliki TXT utworzone wcześniej niż 2 dni temu. O co chodzi?
ls zwraca obiekty, które mają duuużo właściwości, między innymi Name, CreationTime i Extension
Potem te obiekty przechodzą do Select, a select to chirurg, który wyciął wszystko oprócz Name i CreationTime. Czyli teraz ten obiekt ma już +/- tylko 2 właściwości: Name i CreationTime, ale nie ma Extension
Potem w Where każemy wyświetlić tylko te pliki, które mają odpwiedni CreationTime i z tym nie ma problemu, ale dodatkowo chcemy mieć określony Extension… a tej właściwości na tym etapie już nie ma.
Co zrobić? Można zmień kolejność – napierw Where a potem Select i będzie ok:
ls -Recurse C:\Users\rafal\Documents |
Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")} |
Select-Object CreationTime,Name, Extension
Drugie rozwiązanie, to dodać do listy właściwości w poleceniu Select dodatkowej właściwości Extension:
ls -Recurse C:\Users\rafal\Documents |
Select-Object CreationTime,Name, Extension |
Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")}
2019-02-26
Pyton jest dobrym środowiskiem do analizy danych, ale te dane skąś trzeba brać i gdzieś trzeba je zapisywać. Tu z pomocą przyjdzie moduł pyodbc. Oto przykład gdzie:
- pobieramy dane z bazy danych AdventureWorks
- zapisujemy te dane do obiektu data frame
- tworzymy tabelę w bazie danych tempdb
- zapisujemy wybrane dane z dataframe do tej tabeli
import pandas as pd
import pyodbc
sql_conn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};\
SERVER=Dragon01;\
DATABASE=Adventureworks;\
Trusted_Connection=yes')
query = "select CurrencyCode, Name, ModifiedDate from Sales.Currency"
df = pd.read_sql(query, sql_conn)
print(df.head(3))
sql_conn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};\
SERVER=Dragon01;\
DATABASE=tempdb;\
Trusted_Connection=yes')
cursor = sql_conn.cursor()
cursor.execute("IF OBJECT_ID('dbo.currencies') IS NOT NULL DROP TABLE dbo.currencies")
sql_conn.commit()
cursor.execute("CREATE TABLE dbo.currencies(\
code VARCHAR(3),\
name VARCHAR(30))")
sql_conn.commit()
for index,row in df.iterrows():
cursor.execute("INSERT INTO dbo.currencies(code,name) values (?,?)",
row['CurrencyCode'], row['Name'])
sql_conn.commit()
cursor.close()
sql_conn.close()
Po kolei: Czytaj dalej »
2019-02-11
Dobre środowisko programistyczne w naszych czasach powinno „myśleć” razem z programistą. Ktokolwiek pracował w edytorze, który podpowiada ciąg dalszy nazw zmiennych, funkcji itp. ten wie o czym mówię. Dramat zaczyna się wtedy, kiedy te metody zawiodą!
I tak w Python IDLE zdarza się, że TAB nie działa
Tabulator działa, ale jego użycie może być trochę „tricky”. Zrób tak:
-napisz
tekst='Friday'
lub coś innego co spowoduje powstanie zmiennej tekstowej.
-zapisz plik
-uruchom go chociaż raz. Teraz w pamięci Pythona jest już informacja, że text jest zmienną typu tekstowego
-teraz wróć do edytora i napisz nazwę zmiennej i kropkę
text.
-teraz naciśnij tabulator. Powinny się pokazać funkcje specyficzne dla typu string
To jest super niewygodne kiedy chcesz to zrobić dla jednej zmiennej w banalnie prostym skrypcie. Ale kiedy piszesz dłuuuugi skrypt i uruchamiasz go dziesiątki razy, to Python jest świadomy wszystkich zmiennych i ładnie podpowiada.

Gdyby mimo to podpowiadanie nie działało, to jest jeszcze prawdopodobne, że coś poszło nie tak z intalacją i brakuje rozszerzenia odpowiadającego za podpowiadanie. Po wejściu do ustawień IDLE na zakładce Extensions można sprawdzić obecność rozszerzenia AutoComplete i ewentualnie sprawdzić czy jest włączone. Podobno pomaga reinstalacja pythona (zwróć uwagę na zaznaczenie [ ] Add Python to PATH)

Inne możliwe przyczyny takiego zachowania:
- katalog, w którym jest wykonana instalacja, albo katalog ze skryptami, albo nazwa użytkownika zawierają polskie literki np. ą, ś, ł itp.
- jeden z wcześniej utworzonych skryptów otrzymał nazwę, która jest używana przez wymagany przez IDLE moduł pythona. Staraj się unikać nazw, co do których można mieć podejrzenie, że są one już wykorzystywane w Pythonie, np. time, random, int itp. Tworząc własne skrypty możesz np. stosować nietypowe nazwy w rodzaju measure_time.py, generate_randoms.py, test_int.py itd.