Seite 1 von 1

input() loop für def-Abschnitt

Verfasst: Freitag 4. September 2020, 12:58
von Karlirex
Hallo,
ich wollte ein Programm zum Datei öffnen und bearbeiten schreiben, welches per Input die gewählte Datei bearbeitet.
Mit dem aktuellen Programm bricht das Programm mit einem Error ab, da die Datei (welche als Abbruchsbefehlt eingetippt wird) nicht existiert.

Code: Alles auswählen

def write_all(file):
    data = pd.read_csv('./Test/' + file, sep='\s+' , decimal = ',', names = ['ID', 'Name', 'R.Time', 'Area', 'Height', 'Conc.','Curve', '3rd', '2nd', '1st', 'Constant', 'Area Ratio', 'Height Ratio', 'Conc. %', 'Norm Conc.'])
    
    name = np.array(data['Name'])
    conc = np.array(data['Conc.'])
    
    info_df = {"Name": name, "Conc. mg/g": conc}
    df = pd.DataFrame(data = info_df)
    
    select_sorbitol = df.loc[df['Name'] == 'Sorbitol']
    select_isosorbid = df.loc[df['Name'] == 'Isosorbitol']
    
    select_sorbitol.to_csv("Sorbitol.csv", mode = "a", header = False, sep = ";")
    select_isosorbid.to_csv("Isosorbid.csv", mode = "a", header = False, sep = ";")

Code: Alles auswählen

while True:
    try:
        write_all(input())
    except KeyboardInterrupt:
            confirm = raw_input('Enter "yes" to cancel or "no" to keep running [yes/no]:').strip().lower()
            if confirm == 'yes':
                break
Mit dem KeyboardInterrupt: alleinstehend für Ctrl + C Abbruch, erhalte ich keinerlei Resonanz (vllt, weil es in einem Jupyter Notebook geschrieben ist).

Gibt es da eine andere Schleifen-Möglichkeit? Oder vielleicht sogar mit einer "Zählfunktion", damit man eine Information darüber erhält, wie viele Dateien bearbeitet wurden.

Beste Grüße und vielen Dank

Re: input() loop für def-Abschnitt

Verfasst: Freitag 4. September 2020, 13:36
von Sirius3
@Karlirex: file sollte eher filename heißen. Um die Gleichheitszeichen von Schlüssel-Wert-Argumenten kommen keine Leerzeichen.
Warum wandelst du bestimmte Spalten erst in ein numpy-Array um gleich darauf wieder ein Dataframe zu machen?
Warum liest du überhaupt alle Spalten ein, wenn Du nur zwei davon brauchst?
Die ersten fünf Zeilen könnte man auch durch einem read_csv-Aufruf mit usecol ersetzen.
Du benutzt input und raw_input. Verwendest Du noch Python2?
Als Abbruchbedingung böte sich ein leerer String an:

Code: Alles auswählen

while True:
    filename = input()
    if not filename:
        break
    write_all(filename)

Re: input() loop für def-Abschnitt

Verfasst: Freitag 4. September 2020, 14:27
von Karlirex
Dein Vorschlag funktionierte, danke dafür.
Gibt es denn noch einen Weg, die file-Eingabe mitzuzählen, damit man diese Zählung vllt weiter unten einbeziehen könnte?



Meiner Ansicht nach, habe ich das so geöffnet, weil die Datei eben keine Spalteninfos enthält, was bis jetzt immer zu einem Fehler bzgl der Zuweisung ergab, da die Dateien nur einfache .txt-Dateien sind.

Das mit raw_input war ein Google-Vorschlag, daher habe ich dies einfach übernommen, genauso wie daraus das mit dem Leerzeichen beim Gleichheitszeichen entstand.

Das mit der numpy-Umwandlung resulierte daraus, dass ich im folgenden mit auch vorgegebenen Werten rechnen muss, das verschluckt sich mit der pandas-Tabelle aufgrund des Index(jegliche Bearbeitung führte zu keinem Erfolg).
Erkennbar, vllt am gesamten Code:

Code: Alles auswählen

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path

#Dateien einlesen + Speicherort angeben -------------------------------------------------------------------------------------

def import_and_short():
    
    file_paths = [path
        for path in directory_path.iterdir()
        if path.is_file() and path.suffix in [".txt", ".csv"]]
#
# Kürzen auf die benötigten Daten (nur Detektorsignal gegen Zeit)--------------------------------------------------
#
    for file_path in file_paths:
        with file_path.open("r", encoding="ascii") as file:
            lines = list(file)

        first_line_index = (lines.index('[Compound Results(Detector A)]\n') + 3)
        last_line_index = (lines.index('[Compound Results(PDA)]\n') - 1)

        with (save_path / "Test" / file_path.name).open("w", encoding="ascii") as file:
            file.writelines(lines[first_line_index:last_line_index])
            file.close()
    return file_paths


    
if __name__ == "__main__":
    
    directory_path = Path("./Ordner")
    save_path = Path(".")
    
    files = import_and_short()

Code: Alles auswählen

def write_all(file):
    data = pd.read_csv('./Test/' + file, sep='\s+' , decimal = ',', names = ['ID', 'Name', 'R.Time', 'Area', 'Height', 'Conc.','Curve', '3rd', '2nd', '1st', 'Constant', 'Area Ratio', 'Height Ratio', 'Conc. %', 'Norm Conc.'])
    
    name = np.array(data['Name'])
    conc = np.array(data['Conc.'])
    
    info_df = {"Name": name, "Conc. mg/g": conc}
    df = pd.DataFrame(data = info_df)
    
    select_sorbitol = df.loc[df['Name'] == 'Sorbitol']
    select_isosorbid = df.loc[df['Name'] == 'Isosorbitol']
    
    select_sorbitol.to_csv("Sorbitol.csv", mode = "a", header = False, sep = ";")
    select_isosorbid.to_csv("Isosorbid.csv", mode = "a", header = False, sep = ";")

Code: Alles auswählen

while True:
    file = input()
    if not file:
        break
    write_all(file)

Code: Alles auswählen

data_sorbitol = np.genfromtxt("Sorbitol.csv", delimiter = ";")
data_isosorbid = np.genfromtxt("Isosorbid.csv", delimiter = ";")
x, name, conc_sorbitol = data_sorbitol.T
x, name, conc_isosorbid = data_isosorbid.T
m_sorbitol = 2000#Abfrage in mg
m_ansatz = 22.4#Abfrage in g
start_sorbitol = np.array([m_sorbitol / m_ansatz])
start_isosorbid = np.array([0])

sorbitol_conc = np.concatenate((start_sorbitol, conc_sorbitol))
isosorbid_conc = np.concatenate((start_isosorbid, conc_isosorbid))

print(sorbitol_conc)
print(isosorbid_conc)

Code: Alles auswählen

t = np.array([0, 1, 3, 6])
mw_sorbitol = 182.17
n_sorbitol = m_sorbitol / mw_sorbitol

mw_isosorbid = 146.14
m_isosorbid_soll = mw_isosorbid * n_sorbitol

m_gesamt_sorbitol = m_ansatz * sorbitol_conc
m_gesamt_isosorbid = m_ansatz * isosorbid_conc

ausbeute_sorbitol = m_gesamt_sorbitol / m_sorbitol * 100
ausbeute_isosorbid = m_gesamt_isosorbid / m_isosorbid_soll * 100

print(ausbeute_sorbitol)

plt.plot(t, ausbeute_sorbitol)
Ja mir sind Sachen wie m_, n_ und t bewusst, dennoch werde ich da erstmal nichts dran ändern, da dies die Fachsprache für den Nutzen des Programms darstellt.
Für sonstige Verbesserung gerne immer her damit :D

Grüße