ich muss euch nochmals um Hilfe bitten.
Ich habe mehrere '.csv' Dateien mit folgendem beispielhaften Inhalt:
Code: Alles auswählen
hour,minute
2,30
5,10
9,50
Das mit dem USB-Stick habe ich schon hinbekommen. Gerade versuche ich einen Code zu schreiben, der die *.csv-Dateien ausliest, die Zeit darin zusammenzählt und dann in die Excel schreibt.
Mein Problem dabei ist, das ich es nicht hinbekomme in der vorhandenen Datei die Werte in die nächsten leeren Zellen zu schreiben. Als letztes habe ich es noch mit 'pandas' und 'openpyxl' in Kombination versucht. Aber ich schaffe es leider nicht. Die Test-Excel-Datei lässt sich mittlerweile nicht mehr öffnen.
Ich habe zwar nicht das ganze Internet durchsucht, aber eine Menge Anleitungen gefunden, jedoch sind wird in sehr vielen einen neue xlsx-Datei erstellt und die anderen die für mich vertrauenswürdig aussahen brachten mich nicht zum Erfolg.
Es "muss" in Excel sein, da die Person die mit den Daten später arbeitet das so am liebsten hat und ich froh bin, dass das jemand für mich übernimmt.
Meine Alternative, die ich zu 99,5378% auch hinbekomme wäre, dass Excel mittels VBA die Werte aus den *.csv Dateien selbst ausliest, ABER ich habe allein in den folgenden Python-Code schon sehr viel Zeit reingesteckt, das wäre für mich sehr schade und deprimierend wenn ich den wegwerfen müsste. (Auch wenn es wahrscheinlich für euch nichts besonderes ist)
Also soweit bin ich, darin enthalten ist der Versuch aus dem letzten Forumsbeitrage den ich zur Problemlösung versucht hatte:
Code: Alles auswählen
#!/usr/bin/env python3
import csv
import pandas as pd
from openpyxl import load_workbook
from pathlib import Path
CSV_PATH = Path.home() / 'Dokumente' / 'Python' / 'Python_Excel'
EXCEL_PATH = Path('/media/Dennis/Arbeitszeiten/Arbeitszeiten.xlsx')
def read_time(csv_file):
hours = []
minutes = []
with open(csv_file, newline='') as csvfile:
csvreader = csv.DictReader(csvfile)
for row in csvreader:
hours.append(int(row['hour']))
minutes.append(float(row['minute']))
total_hours = sum(hours)
total_minutes = sum(minutes)
if total_minutes >= 60:
new_hour, new_minutes = calculate_minutes(total_minutes)
total_hours += new_hour
total_minutes = new_minutes
return total_hours, total_minutes
def calculate_minutes(minutes):
hour = round(minutes / 60, 2)
minute = round(int(str(hour)[-2:]) * 0.6)
hour = int(str(hour)[:-3])
return hour, minute
def search_files():
files = []
for file in CSV_PATH.iterdir():
files.append(file)
return files
def write_in_excel(csv_file, hours, minutes):
order = str(csv_file)[:-4]
working_time = f'{hours},{minutes}'
writing_data = pd.DataFrame({'Auftrag':[order], 'Arbeitszeit':[working_time], 'Erledigt':['']})
with pd.ExcelWriter(EXCEL_PATH, engine='openpyxl', mode='a') as writer:
writing_data.to_excel(writer, sheet_name="2021", cols=['Auftrag', 'Arbeitszeit', 'Erledigt'])
def main():
csv_files =search_files()
for csv_file in csv_files:
hours, minutes = read_time(csv_file)
write_in_excel(csv_file.name, hours, minutes)
if __name__ == '__main__':
main()
Code: Alles auswählen
Traceback (most recent call last):
File "/home/dennis/Dokumente/excel_test.py", line 58, in <module>
main()
File "/home/dennis/Dokumente/excel_test.py", line 54, in main
write_in_excel(csv_file.name, hours, minutes)
File "/home/dennis/Dokumente/excel_test.py", line 46, in write_in_excel
with pd.ExcelWriter(EXCEL_PATH, engine='openpyxl', mode='a') as writer:
File "/home/dennis/.local/lib/python3.9/site-packages/pandas/io/excel/_openpyxl.py", line 41, in __init__
self.book = load_workbook(self.handles.handle)
File "/home/dennis/.local/lib/python3.9/site-packages/openpyxl/reader/excel.py", line 315, in load_workbook
reader = ExcelReader(filename, read_only, keep_vba,
File "/home/dennis/.local/lib/python3.9/site-packages/openpyxl/reader/excel.py", line 124, in __init__
self.archive = _validate_archive(fn)
File "/home/dennis/.local/lib/python3.9/site-packages/openpyxl/reader/excel.py", line 96, in _validate_archive
archive = ZipFile(filename, 'r')
File "/usr/lib64/python3.9/zipfile.py", line 1257, in __init__
self._RealGetContents()
File "/usr/lib64/python3.9/zipfile.py", line 1324, in _RealGetContents
raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file
Dennis
PS: Der Teil mit dem USB-Stick ist in einer anderen .py-Datei. Ich versuche erst immer die Funktionen getrennt zum laufen zu bekommen, bis ich sie dann zusammen füge.