Ein- und Ausgabe I/O¶

zahlreiche Varianten und Funktionen, das Folgende ist eine kleine Auswahl

Konsole¶

  • OS-abhängig; üblicherweise 3 Kanäle (streams): stdin, stdout, stderr (Standardinput, -output, -errorkanal)
  • Schreiben nach stdout: print(),println(),printstyled()
  • Schreiben nach stderr: print(strerr,...), println(stderr,...), printstyled(stderr,...)
  • Lesen von stdin: readline()

Umwandeln von Strings in andere Typen:¶

  • chomp() entfernt newline
  • split() zerlegt in "Wörter"
  • parse() wandelt in andere Typen um

Buffer¶

  • write-Zugriffe werden gebuffert.

    • flush(stdout) leert Buffer
In [1]:
# aus dem ersten Beispielprogramm

function input(prompt = "Eingabe:")
    println(prompt)
    flush(stdout)
    return chomp(readline())
end
Out[1]:
input (generic function with 2 methods)
In [2]:
a = input("Bitte 2 Zahlen eingeben!")
Bitte 2 Zahlen eingeben!
stdin> 33 67
Out[2]:
"33 67"
In [3]:
av = split(a)
Out[3]:
2-element Vector{SubString{String}}:
 "33"
 "67"
In [4]:
parse.(Int, av)
Out[4]:
2-element Vector{Int64}:
 33
 67
In [5]:
# Ausgaben auf den Fehlerkanal stderr erscheinen im Jupyter in rot:

println(stderr, "Das sollte nicht passieren!")
Das sollte nicht passieren!

Einzelne Tastenanschläge einlesen¶

  • readline() u.ä. warten auf den Abschluss der Eingabe durch Drücken der Enter-Taste.
  • Zum Einlesen einzelner keystrokes:

    • https://stackoverflow.com/questions/56888266/how-to-read-keyboard-inputs-at-every-keystroke-in-julia
    • https://stackoverflow.com/questions/60954235/how-can-i-test-whether-stdin-has-input-available-in-julia

Formatierte Ausgabe mit dem Printf-Paket¶

Die Macros @sprintf und @printf sind den gleichnamigen C-Funktionen nachempfunden

  • Formatstring: Normaler String mit Platzhaltern
  • Platzhalter haben die Form
    %[flags][width][.precision]type
    (wobei die Angaben in eckigen Klammern alle optional sind)
  • Typen:

    %s      string
    %i      integer
    %o      integer octal (base=8)
    %x, %X  integer hexadecimal (base=16) with digits 0-9abcdef  or 0-9ABCDEF, resp.
    %f      floatong point number
    %e      floating point number, scientific representation
    %g      floating point, uses %f or %e depending on value
  • Flags:

    Pluszeichen:    rechtsbündig (Standard)
    Minuszeichen:   linksbündig
    Null:           mit führenden Nullen
  • Width:

    Anzahl der minimal verwendeten Zeichen (wenn nötig, werden auch mehr genommen)

Zeit für Beispiele:

In [6]:
using Printf    # Paket laden nicht vergessen!
In [7]:
@printf("|%s|", "Hallo")     # string mit Platzhalter für String
|Hallo|
In [8]:
@printf("|%10s|", "Hallo")   # Minimallänge, rechtsbündig
|     Hallo|
In [9]:
@printf("|%-10s|", "Hallo")     # linksbündig
|Hallo     |
In [10]:
@printf("|%3s|", "Hallo")     # Längenangabe kann überschritten werden 
                              # besser eine 'kaputt formatierte' Tabelle als falsche Werte!!
|Hallo|
In [11]:
j = 123
k = 90019001
l = 3342678

@printf("j= %012i, k= %-12i, l = %12i", j, k, l)   #  0-Flag für führende Nullen
j= 000000000123, k= 90019001    , l =      3342678

@printf und @sprintf können wie alle Macros wie Funktionen aufgerufen werden:

In [12]:
@printf("%i %i", 22, j)
22 123

-- oder wie Macros, also ohne Funktionsklammern und ohne Komma:

In [13]:
@printf "%i %i" 22 j
22 123

@printf kann als erstes Argument noch einen stream übergeben bekommen.

Ansonsten besteht die Argumentliste aus

  • Formatstring mit Platzhaltern
  • Variablen in der Reihenfolge der Platzhalter, in Anzahl und Typ zu den Platzhaltern passend
In [14]:
@printf(stderr, "Erstes Resultat: %i %s\nZweites Resultat %i", 
                                   j, "(geschätzt)"       ,k)
Erstes Resultat: 123 (geschätzt)
Zweites Resultat 90019001

@sprintf druckt nichts, sondern liefert den ausgefüllten formatierten String zurück:

In [15]:
str = @sprintf("x = %10.6f", π );
In [16]:
str
Out[16]:
"x =   3.141593"
Formatierung der Gleitkommazahlen:¶

Bedeutung des Precision-Wertes:

  • %f und %e-Format: max. Anzahl der Nachkommastellen
  • %g-Format: max. Anzahl von ausgegebenen Ziffern (Vor- + Nachkommastellen)
In [17]:
x = 123456.7890123456

@printf("%20.4f   %20.4e", x, x)     # 4 Nachkommastellen
         123456.7890             1.2346e+05
In [18]:
@printf("%20.7f %20.7e", x, x)     # 7 Nachkommastellen
      123456.7890123        1.2345679e+05
In [19]:
@printf("%20.7g %20.4g", x, x)    # insgesamt 7 bzw. 4 Stellen
            123456.8            1.235e+05

Dateioperationen¶

Dateien werden

  • geöffnet ==> Dabei ensteht ein neues stream-Objekt (zusätzlich zu stdin, stdout, stderr)
  • dann kann dieser stream gelesen und geschrieben werden
  • geschlossen ==> stream-Objekt wird von Datei getrennt

    stream = open(path, mode)
  • path: Dateiname/pfad

  • mode:
    "r"    read, öffnet am Dateianfang
    "w"    write, öffnet am Dateianfang (Datei wird neu angelegt oder überschrieben)
    "a"    append, öffnet zum Weiterschreiben am Dateiende
In [20]:
f = open("datei.txt", "w")
Out[20]:
IOStream(<file datei.txt>)
In [21]:
@printf(f, "%20i\n", k)
In [22]:
println(f, " zweite Zeile")
In [23]:
close(f)
In [24]:
;cat datei.txt
            90019001
 zweite Zeile
In [25]:
f = open("datei.txt", "r")
Out[25]:
IOStream(<file datei.txt>)
In [26]:
n = 0
for i in readlines(f)    # Lese zeilenweise
    n += 1
    println(n, i)       # Drucke mit Zeilennummer
end
1            90019001
2 zweite Zeile

Pakete für Dateiformate¶

Pakete für die Ein- und Ausgabe in den verschiedensten Dateiformaten

  • PrettyTables.jl Ausgabe von formatierten Tabellen
  • DelimitedFiles.jl Ein- und Ausgabe von Matrizen u.ä.
  • CSV.jl Ein- und Ausgabe von Dateien mit "comma-delimited values" u.ä.
  • XLSX.jl Ein- und Ausgabe von Excel-Dateien

und viele andere mehr...

Delimited Files¶

In [27]:
using DelimitedFiles
In [28]:
A = rand(200,3)
Out[28]:
200×3 Matrix{Float64}:
 0.340458   0.825769   0.10208
 0.0268893  0.949268   0.908559
 0.649896   0.395813   0.353179
 0.14032    0.291844   0.830224
 0.63363    0.276789   0.831877
 0.524021   0.246762   0.419489
 0.585347   0.880953   0.608495
 0.777373   0.387001   0.0595369
 0.347182   0.991371   0.72133
 0.418528   0.478036   0.955822
 0.602542   0.84481    0.755724
 0.19726    0.48635    0.223986
 0.488213   0.32438    0.640762
 ⋮                     
 0.0109543  0.464666   0.0338036
 0.424558   0.739999   0.69583
 0.958684   0.432141   0.809327
 0.562518   0.273888   0.232715
 0.779498   0.0941955  0.447725
 0.65658    0.236674   0.0702908
 0.240148   0.216886   0.31698
 0.878407   0.453928   0.715879
 0.387353   0.864377   0.0140109
 0.818247   0.30614    0.724261
 0.699524   0.204064   0.308865
 0.07843    0.104628   0.715755
In [29]:
f = open("data2.txt", "w")
Out[29]:
IOStream(<file data2.txt>)
In [30]:
writedlm(f, A)
In [31]:
close(f)
In [32]:
;head data2.txt
0.3404584106811863	0.8257693260643905	0.10208011760128599
0.026889328033128268	0.9492675653854479	0.9085591450702581
0.6498963717719178	0.3958125045190971	0.35317912384984795
0.14032004382389018	0.2918439613799869	0.8302239965868584
0.633630005283942	0.2767888491501992	0.8318766514610799
0.5240208117170729	0.24676197726593674	0.41948911446627135
0.585346515700062	0.8809527810080108	0.6084948567669999
0.7773727819682476	0.38700114682941644	0.05953685007070941
0.34718210294604357	0.9913709382217284	0.7213300130637681
0.41852821927063044	0.47803588615962034	0.9558221787263325
In [33]:
B = readdlm("data2.txt")
Out[33]:
200×3 Matrix{Float64}:
 0.340458   0.825769   0.10208
 0.0268893  0.949268   0.908559
 0.649896   0.395813   0.353179
 0.14032    0.291844   0.830224
 0.63363    0.276789   0.831877
 0.524021   0.246762   0.419489
 0.585347   0.880953   0.608495
 0.777373   0.387001   0.0595369
 0.347182   0.991371   0.72133
 0.418528   0.478036   0.955822
 0.602542   0.84481    0.755724
 0.19726    0.48635    0.223986
 0.488213   0.32438    0.640762
 ⋮                     
 0.0109543  0.464666   0.0338036
 0.424558   0.739999   0.69583
 0.958684   0.432141   0.809327
 0.562518   0.273888   0.232715
 0.779498   0.0941955  0.447725
 0.65658    0.236674   0.0702908
 0.240148   0.216886   0.31698
 0.878407   0.453928   0.715879
 0.387353   0.864377   0.0140109
 0.818247   0.30614    0.724261
 0.699524   0.204064   0.308865
 0.07843    0.104628   0.715755
In [34]:
# man kann open() auch als 1.Argument eine function(iostream) übergeben, die auf den stream 
# angewendet wird, wonach der stream automatisch geschlosssen wird.  
#
# Mit der do-Notation sieht obiger code so aus:

open("data2.txt", "w") do io
    writedlm(io, A)
end

CSV und DataFrames¶

  • DataFrames.jl ist ein Paket zum bequemen Umgang mit tabellarischen Daten
In [35]:
using CSV, DataFrames, Downloads
In [36]:
# Wetterdaten von Westerland, s. https://dev.meteostat.net/bulk/hourly.html


url = "https://bulk.meteostat.net/v2/hourly/10018.csv.gz"
Out[36]:
"https://bulk.meteostat.net/v2/hourly/10018.csv.gz"
In [37]:
http_response = Downloads.download(url)
Out[37]:
"/tmp/jl_R2uC9y"
In [38]:
file = CSV.File(http_response, header=false)
Out[38]:
161343-element CSV.File:
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 7, Column3 = 6.0, Column4 = missing, Column5 = missing, Column6 = missing, Column7 = missing, Column8 = 270, Column9 = 11.2, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 8, Column3 = 6.0, Column4 = -1.9, Column5 = 57, Column6 = missing, Column7 = missing, Column8 = 250, Column9 = 11.2, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 9, Column3 = 7.0, Column4 = -3.0, Column5 = 49, Column6 = missing, Column7 = missing, Column8 = 250, Column9 = 14.8, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 10, Column3 = 7.0, Column4 = -1.9, Column5 = 53, Column6 = missing, Column7 = missing, Column8 = 250, Column9 = 18.4, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 11, Column3 = 8.0, Column4 = -1.0, Column5 = 53, Column6 = missing, Column7 = missing, Column8 = 220, Column9 = 24.1, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 12, Column3 = 8.0, Column4 = 0.0, Column5 = 57, Column6 = missing, Column7 = missing, Column8 = 240, Column9 = 27.7, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 13, Column3 = 8.0, Column4 = -1.0, Column5 = 53, Column6 = missing, Column7 = missing, Column8 = 240, Column9 = 25.9, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 14, Column3 = 8.0, Column4 = 0.0, Column5 = 57, Column6 = missing, Column7 = missing, Column8 = 230, Column9 = 29.5, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-18"), Column2 = 15, Column3 = 8.0, Column4 = 0.0, Column5 = 57, Column6 = missing, Column7 = missing, Column8 = 230, Column9 = 31.7, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-23"), Column2 = 9, Column3 = 7.0, Column4 = -0.9, Column5 = 57, Column6 = missing, Column7 = missing, Column8 = 280, Column9 = 37.1, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-23"), Column2 = 10, Column3 = 7.0, Column4 = -0.9, Column5 = 57, Column6 = missing, Column7 = missing, Column8 = 270, Column9 = 64.8, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-23"), Column2 = 11, Column3 = 7.0, Column4 = -0.9, Column5 = 57, Column6 = missing, Column7 = missing, Column8 = 280, Column9 = 33.5, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("1989-03-27"), Column2 = 7, Column3 = 6.0, Column4 = 4.0, Column5 = 87, Column6 = missing, Column7 = missing, Column8 = 160, Column9 = 11.2, Column10 = missing, Column11 = missing, Column12 = missing, Column13 = missing)
 ⋮
 CSV.Row: (Column1 = Dates.Date("2022-06-20"), Column2 = 0, Column3 = 15.0, Column4 = 11.2, Column5 = 78, Column6 = missing, Column7 = missing, Column8 = 300, Column9 = 30.2, Column10 = missing, Column11 = 1012.5, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-20"), Column2 = 6, Column3 = 13.1, Column4 = 9.4, Column5 = 78, Column6 = missing, Column7 = missing, Column8 = 303, Column9 = 25.2, Column10 = missing, Column11 = 1012.2, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-20"), Column2 = 12, Column3 = 14.3, Column4 = 10.1, Column5 = 76, Column6 = missing, Column7 = missing, Column8 = 294, Column9 = 28.1, Column10 = missing, Column11 = 1011.5, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-20"), Column2 = 18, Column3 = 18.0, Column4 = 13.9, Column5 = 77, Column6 = missing, Column7 = missing, Column8 = 300, Column9 = 26.3, Column10 = missing, Column11 = 1010.4, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-21"), Column2 = 0, Column3 = 14.9, Column4 = 10.9, Column5 = 77, Column6 = missing, Column7 = missing, Column8 = 297, Column9 = 21.6, Column10 = missing, Column11 = 1012.1, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-21"), Column2 = 6, Column3 = 13.4, Column4 = 9.8, Column5 = 79, Column6 = missing, Column7 = missing, Column8 = 276, Column9 = 20.9, Column10 = missing, Column11 = 1010.5, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-21"), Column2 = 12, Column3 = 14.5, Column4 = 10.9, Column5 = 79, Column6 = missing, Column7 = missing, Column8 = 277, Column9 = 22.0, Column10 = missing, Column11 = 1010.9, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-21"), Column2 = 18, Column3 = 18.1, Column4 = 14.6, Column5 = 80, Column6 = missing, Column7 = missing, Column8 = 286, Column9 = 21.6, Column10 = missing, Column11 = 1009.9, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-22"), Column2 = 0, Column3 = 15.2, Column4 = 11.6, Column5 = 79, Column6 = missing, Column7 = missing, Column8 = 277, Column9 = 19.4, Column10 = missing, Column11 = 1009.5, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-22"), Column2 = 6, Column3 = 13.2, Column4 = 9.6, Column5 = 79, Column6 = missing, Column7 = missing, Column8 = 274, Column9 = 18.0, Column10 = missing, Column11 = 1008.0, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-22"), Column2 = 12, Column3 = 15.0, Column4 = 11.2, Column5 = 78, Column6 = missing, Column7 = missing, Column8 = 266, Column9 = 20.2, Column10 = missing, Column11 = 1008.0, Column12 = missing, Column13 = missing)
 CSV.Row: (Column1 = Dates.Date("2022-06-22"), Column2 = 18, Column3 = 18.8, Column4 = 15.1, Column5 = 79, Column6 = missing, Column7 = missing, Column8 = 262, Column9 = 15.8, Column10 = missing, Column11 = 1006.0, Column12 = missing, Column13 = missing)
In [39]:
# https://dev.meteostat.net/bulk/hourly.html#endpoints

# Spalte 1  Datum
#        2  Uhrzeit (Stunde)
#        3  Temp
#        5  Luftfeuchtigkeit
#        6  Niederschlag
#        8 Windrichtung
#        9 Windstärke


df =  DataFrame(file)
Out[39]:

161,343 rows × 13 columns (omitted printing of 4 columns)

Column1Column2Column3Column4Column5Column6Column7Column8Column9
DateInt64Float64?Float64?Int64?Float64?MissingInt64?Float64?
11989-03-1876.0missingmissingmissingmissing27011.2
21989-03-1886.0-1.957missingmissing25011.2
31989-03-1897.0-3.049missingmissing25014.8
41989-03-18107.0-1.953missingmissing25018.4
51989-03-18118.0-1.053missingmissing22024.1
61989-03-18128.00.057missingmissing24027.7
71989-03-18138.0-1.053missingmissing24025.9
81989-03-18148.00.057missingmissing23029.5
91989-03-18158.00.057missingmissing23031.7
101989-03-2397.0-0.957missingmissing28037.1
111989-03-23107.0-0.957missingmissing27064.8
121989-03-23117.0-0.957missingmissing28033.5
131989-03-2776.04.087missingmissing16011.2
141989-03-2788.04.981missingmissing16014.8
151989-03-279missingmissingmissingmissingmissing16014.8
161989-03-2710missingmissingmissingmissingmissing15014.8
171989-03-2711missingmissingmissingmissingmissing15022.3
181989-03-2712missingmissingmissingmissingmissing14027.7
191989-03-2714missingmissingmissingmissingmissing14029.5
201989-03-31810.06.076missingmissing27018.4
211989-03-31910.06.076missingmissing27014.8
221989-03-311010.06.076missingmissing28018.4
231989-03-311111.05.971missingmissing28018.4
241989-03-311211.05.971missingmissing28018.4
251989-03-311311.05.971missingmissing29018.4
261989-04-0177.01.166missingmissing8037.1
271989-04-0188.02.066missingmissing7027.7
281989-04-0198.00.961missingmissing9033.5
291989-04-01109.00.957missingmissing8038.9
301989-04-01119.0-2.046missingmissing7033.5
⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮
In [40]:
describe(df)
Out[40]:

13 rows × 7 columns

variablemeanminmedianmaxnmissingeltype
SymbolUnion…AnyAnyAnyInt64Type
1Column11989-03-182010-09-212022-06-220Date
2Column211.7822012.0230Int64
3Column310.5158-14.011.034.01250Union{Missing, Float64}
4Column46.91075-18.17.025.01603Union{Missing, Float64}
5Column579.90071882.01001603Union{Missing, Int64}
6Column60.09327620.00.05.0125723Union{Missing, Float64}
7Column7161343Missing
8Column8208.5970230.03602216Union{Missing, Int64}
9Column922.92060.022.3211.3304Union{Missing, Float64}
10Column1037.16445.535.2105.6127105Union{Missing, Float64}
11Column111014.08970.01015.01049.0116873Union{Missing, Float64}
12Column12161343Missing
13Column134.5814404.025124875Union{Missing, Int64}
In [41]:
using StatsPlots
In [42]:
using Dates
In [43]:
# neue Spalte mit Sp.1 und 2  (date & time) kombiniert

df[!, :datetime] = DateTime.(df.Column1) .+ Hour.(df.Column2);
In [44]:
describe(df)
Out[44]:

14 rows × 7 columns (omitted printing of 2 columns)

variablemeanminmedianmax
SymbolUnion…AnyAnyAny
1Column11989-03-182010-09-212022-06-22
2Column211.7822012.023
3Column310.5158-14.011.034.0
4Column46.91075-18.17.025.0
5Column579.90071882.0100
6Column60.09327620.00.05.0
7Column7
8Column8208.5970230.0360
9Column922.92060.022.3211.3
10Column1037.16445.535.2105.6
11Column111014.08970.01015.01049.0
12Column12
13Column134.5814404.025
14datetime1989-03-18T07:00:002010-09-21T21:00:002022-06-22T18:00:00
In [45]:
@df df plot(:datetime, :Column3)
Out[45]:
In [46]:
@df df plot(:datetime, [:Column9, :Column6, :Column3], 
            xlims = (DateTime(2022,1,1), DateTime(2022,7,1)), 
            layout=(3,1), title=["Wind" "Regen" "Temp"], legend=:none)
Out[46]:
In [ ]: