#!/usr/bin/env python
# coding: utf-8

# # Schreiben und Lesen von Daten

# Erstellen eines Beispieldatensatzes

# In[4]:


data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
data


# ## Schreiben und Lesen von Daten mit Python 
# Hier verwenden wir die in Python eingebaute Funktion __open__, um auf Dateiobjekt (Fileobject) zu erzeugen.
# ```python
# open(file, mode)
# mode : 'w' schreiben (write)
#        'a' anhängen  (append)
#        'r' lesen     (read)
# file : Name der Datei
# ```

# In[1]:


f = open('daten.txt', 'w')
f.close()


# In[2]:


f.


# ### Speichern von Daten in einer Textdatei
# Die ganzzahligen Einträge werden mit der Methode __write__ als String durch Kommas getrennt und zeilenweise in die Datei data.txt eingetragen 

# In[5]:


with open('data1.txt', 'w') as file:
    for zeile in data:
        for elem in zeile[:-1]:
            file.write(f'{elem},')
        file.write(f'{zeile[-1]} \n')  # '\n' sorgt fuer eine neue Zeile


# Mit dem __with__ Statement lassen sich die folgenden Befehle gut zusammenfassen. Der Kontextmanager sorgt in dem Fall dafür, dass man das Fileobjekt nicht abschliessen muss und am Ende "aufgeräumt" wird.   

# Mit drei Zeilen mehr kann man auch selbst dafür sorgen, dass bei einem Fehler aufgeräumt wird.

# In[65]:


file = open('data1a.txt', 'w')
try:
    for zeile in data:
        for elem in zeile[:-1]:
            file.write(f'{elem},')
        file.write(f'{zeile[-1]} \n')  # '\n' sorgt fuer eine neue Zeile
finally:
    file.close()


# ### Lesen von Daten aus einer Textdatei
# Die Datei 'data.txt' wird zeilenweise eingelesen. Es wird angenomme, dass in jeder Zeile die ganzzahligen Elemente durch Kommas getrennt sind.

# In[57]:


loaded_data_txt = []
with open('data1.txt', 'r') as file:
    for line in file:
        l = line.strip().split(',')
        loaded_data_txt.append([int(elem) for elem in l])

loaded_data_txt


# ## Schreiben und Lesen von Daten mit NumPy
# Für matrixartige Daten geht das in NumPy einfacher

# In[15]:


import numpy as np


# In[35]:


data


# ### Speichern eines NumpyArrays  in einer Textdatei
# Hierbei sollen als Trennzeichen wieder Kommas verwendet werden

# In[36]:


np.savetxt('data2.txt', data, delimiter=',')  


# numpy wandelt hier die Daten ungefragt in float um

# In[37]:


np.savetxt('data3.txt', data, fmt='%d', delimiter=',') 


# die Angabe des Formats 'd' sorgt dafür dass keine unnötigen Kommazahlen erzeugt werden

# ### Lesen von Daten aus einer Textdatei als NumPyarray

# In[38]:


loaded_data2_txt = np.loadtxt('data2.txt', delimiter=',')
loaded_data2_txt


# In[39]:


loaded_data3_txt = np.loadtxt('data3.txt', dtype='int', delimiter=',')
loaded_data3_txt


#  ## Speichern und Lesen von Daten in einer Binärdatei (NumPy-Format)

# In[40]:


np.save('data.npy', data)


# In[41]:


loaded_data_npy = np.load('data.npy')
loaded_data_npy


# ## Speichern und Lesen von mehreren Arrays in einer einzigen Binärdatei

# In[42]:


extra_data = np.array([10, 11, 12])
np.savez('data_multiple.npz', array1=data, array2=extra_data)


# In[43]:


loaded_data_npz = np.load('data_multiple.npz')
print("Array 1:")
print(loaded_data_npz['array1'])
print("Array 2:")
print(loaded_data_npz['array2'])


# In[ ]:




