Permalänk
Medlem

Python programmering

Hej! Jag har suttit med samma fel-meddelande och lyckas inte lösa det då jag är rätt ny på python... Finns det någon som kan rädda mig:D

Koden är:

import os from imap_tools import MailBox, AND user = "XXXXXX@outlook.com" password = "XXXX" server = "outlook.office365.com" mb = MailBox(server).login(user, password) def getDateFromHeader(header): return header [len(header)-10:len(header)] import pandas as pd from openpyxl import load_workbook def storeEmailContentData(message, instance, date): print("begin") data=[] info = message.split('\r\n') for row in info: res=row.split(';') if len (res)>1: res.append(date) print(res) data.append(res) else: print(res) headers = data.pop(0) df = pd.DataFrame(data, columns=headers) wb = load_workbook('C:/Users/rebeccag/code/nya.xlsx') writer = pd.ExcelWriter('C:/Users/rebeccag/code/nya.xlsx', engine='openpyxl') writer.book = wb writer.sheets = dict((ws.title, ws) for ws in writer.book.worksheets) reader = pd.read_excel(r'C:/Users/rebeccag/code/nya.xlsx', sheet_name=instance) print(len(reader)) df.to_excel(writer, sheet_name=instance, index=False,header=False, startrow=len(reader)+1) writer.save() writer.close() return True instances = ["SE", "NO", "DK"] for instance in instances: print(instance) mb = MailBox(server).login(user, password) messages = mb.fetch(mark_seen=False, bulk=True) for msg in messages: if msg.subject.startswith("PA") and "("+instance+")" in msg.subject: print(msg.from_, ': ', msg.subject) storeEmailContentData(msg.text, instance, getDateFromHeader(msg.subject))

Och mitt problem är att jag inte kommer ifrån BadZipFile "file is not a zipfile", det får jag alltså vid (load_workbook). Är det någon som har en idé på vad jag missar?? Så tacksam för hjälp!!

Permalänk
Hedersmedlem

Du skulle behöva stoppa koden inom code-taggar eftersom python-kod är väldigt känsligt för indentering.

[code]
Kod här
[/code]

Blir

Kod här

Nu har jag inte orginalkoden så hjälper inte för mig att stoppa in här

Permalänk
Medlem

Det var lite rörigt kring där du ska skriva excelen. Men antar att du vill ta det du har i "data" och skriva till excelen där sheetname är instancen.

Det borde göras något sånthär

thefilename = 'C:/Users/rebeccag/code/nya.xlsx' wb = load_workbook(filename = thefilename) ws1 = wb.active ws1.title = instance for r in data: ws1.append(r) wb.close() wb.save(filename=thefilename)

Finns inte excelfilen sen tidgare så byt ut
wb = load_workbook(filename = filename') mot wb = Workbook()

Permalänk
Medlem

Vad menar du att du hade ersatt den koden med? Eller ska jag bara lägga till det? Sorry är inte helt med på allt som händer så övertydlighet uppskattas

Permalänk
Medlem

Inga problem
Ersätt denna befintliga kod med det jag skrev ovan:

df = pd.DataFrame(data, columns=headers) wb = load_workbook('C:/Users/rebeccag/code/nya.xlsx') writer = pd.ExcelWriter('C:/Users/rebeccag/code/nya.xlsx', engine='openpyxl') writer.book = wb writer.sheets = dict((ws.title, ws) for ws in writer.book.worksheets) reader = pd.read_excel(r'C:/Users/rebeccag/code/nya.xlsx', sheet_name=instance) print(len(reader)) df.to_excel(writer, sheet_name=instance, index=False,header=False, startrow=len(reader)+1) writer.save() writer.close()

Jag har inte testat koden själv. Så kan vara något fel.
Med load_workbook så behöver filen finnas innan man kör koden.

Permalänk
Medlem

Hjälte

Tack!!! Det löste zip-file problemet!!

Men jag får inte helt rätt resultat, nu hämtar den enbart det som är markerat som NO och lägger i excelfilen medan SE:resultatet inte finns.. (I terminalen får jag från SE med)

Permalänk
Medlem

Det är nog så att den återanvänder samma sheet varje gång
Du kan testa att ändra att det skapas ett nytt varje gång genom att ändra:

ws1 = wb.active

till

ws1 = wb.create_sheet(instance)

Permalänk
Medlem

@rebeccag Fick du ordning på koden till slut?
Har tråkigt på jobbet så finns hjälp att få

Permalänk
Medlem

Återkommer med mer!! Hehe de e inte helt rätt än😬😬

Permalänk
Medlem

@dust79 Har du fortfarande tråkigt?

Permalänk
Medlem

Hehe...nja.
Skulle kunna kika på koden ikväll om det är så att du kört fast.

Permalänk
Medlem

Ja.. Blev tvungen att släppa projektet lite, men såhär ser det ut nu

import os from imap_tools import MailBox, AND user = "****@outlook.com" password = "****" server = "outlook.office365.com" mb = MailBox(server).login(user, password) def getDateFromHeader(header): return header [len(header)-10:len(header)] import pandas as pd from openpyxl import load_workbook def storeEmailContentData(message, instance, date): print("begin") data=[] info = message.split('\r\n') for row in info: res=row.split(';') if len (res)>1: res.append(date) print(res) data.append(res) else: print(res) headers = data.pop(0) thefilename = 'C:/Users/rebeccag/code/nya.xlsx' wb = load_workbook(filename=thefilename) ws1 = wb.create_sheet(instance) ws1.title = instance for r in data: ws1.append(r) wb.close() wb.save(thefilename) instances = ["SE", "NO", "DK"] for instance in instances: print(instance) mb = MailBox(server).login(user, password) messages = mb.fetch(mark_seen=False, bulk=True) for msg in messages: if msg.subject.startswith("PA") and "("+instance+")" in msg.subject: print(msg.from_, ': ', msg.subject) storeEmailContentData(msg.text, instance, getDateFromHeader(msg.subject))

Och outputen blir att den skapar ett sheet som heter SE, ett som heter SE2, ett som heter SE4, och detsamma fast med NO. Jag vill istället spara det så att allt som kommer som SE i mailet, samlas på sheet SE och allt som kommer som NO samlas under sheet NO.

Så jag förstår nog inte riktigt vad det är som gör att det blir SE2. Tänkte först att jag måste spara informationen i olika listor för att sedan specificera vilka sheets dom ska till, för nu är det ju bara ws1. Men ah det hamnar ju ändå på SE och NO så min tanke fallera där..

Permalänk
Medlem

Testa att byta ut raden

ws1 = wb.create_sheet(instance)

mot

ws1 = get_sheet_by_name(instance)

Jag har inte testat detta själv. Men det borde funka om du har en existerande excel fil som redan har sheets som heter SE, NO osv

Permalänk
Medlem

Det funkade... Hur du löser det så enkelt är ett under för mig haha, inspiration!! Tack så hemskt mycket!!!