CSV Datei in Excel inportieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

ich sehe gerade meine vorletzte Antwort wurde überhaupt net gepostet.
Dann halt nochmal:

mit dem Code von dir (ichisich) schreibst du ja auch die Messwerte Zeile für Zeile in Excel. Das habe ich mit diesem Code auch schon gemacht:

Code: Alles auswählen

while(m<len(fListTraceData))
for j, content in enumerate([m, float(fListTraceData[m]), float(fFrequency)]):
 xlApp.ActiveWorkbook.Sheets("SpuriousChain2RS").Cells(n, j+1).Value = content
m += 1
habe mit folgenden Modulen gearbeitet:
import win32com
import win32com.client
from win32com.client import Dispatch

geht das bei dir schneller? Ich benötige über 8 Minuten um 5000x2 Messwerte in Excel zu schreiben. Das ist eindeutig zu lang.

Wenn ja müsstest du mir den Code mal näher erklären:
1. hier sage ich wo ich im Excel File meine Daten haben möchte z.B. in Tabelle2 oder ?
2. wie sieht die for schleife aus bei 5000x2 aus ? Ich habe eine Liste in der ich bei jedem Durchgang den 1. und 2., im nächsten Durchgang den 3. und 4. usw aus der Liste raushole und in Excel schreibe
3. ws.write(i, 0, 'Test' + str(i), style0) ich kann mit den Werten in der Klammer wenig anfangen ? kannst du mir das kurz schildern

oh man ich bin gerade voll überfordert damit. ist wohl die Hitze :-)
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Schau einfach mal bei

python-excel
Da ist alles am Start ...


Noch zu dem mini Bsp.


Das ganze Stylezeugs kannst erstmal veregessen da gehts nur um Style -> Schrift, Farbe etc .....

Code: Alles auswählen

# ein Excel-Workbook-Objekt
wb = xlwt.Workbook()
# dem ein sheet mit dem Namen "A Test Sheet" hunzugefügt wird
ws = wb.add_sheet('A Test Sheet')

for i in xrange(5000):
        #dem Sheet wird in Zeile 'i' und Spalte '0==null' der Wert 'Test[zeilennummer]'
        #hinzugefügt
        ws.write(i, 0, 'Test' + str(i), style0)
        # style0 kannst Du auch weglassen dann wird einfach der Defaultstyle genommen

# Schreib das Excel-Workbook-Objekt in ein File mit dem Namen 'example.xls'
wb.save('example.xls')
In diesem Bsp. wird das Excelfile aber immer neu erstellt. Also vorhandene Daten werden einfach überschrieben.
Wenn Du ein File verändern willst must Du dich bisschen durch die Doku kämpfen die beschreibt sicher wie man ein File öffnet und nur Teile (in deinem Fall die Messdaten) in Spalte X und Zeile Y überschreibt, den Rest aber unberührt lässt.

Gruß
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

ok aber so schreibe ich momentan nur jeweils ein Wert in die Zeile und dann kommt die nächste Zeile, was aber wenn ich 2 Werte habe: Spalte A und Spalte B
wie muss ich das abändern
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Code: Alles auswählen

ws.write(0, 0, 'Zeile 0, Spalte A')
ws.write(0, 1, 'Zeile 0, Spalte B')
ws.write(1, 0, 'Zeile 1, Spalte A')
ws.write(1, 1, 'Zeile 1, Spalte B')
In dem Link sind aber echt viel Beispiele die man Kopieren, in ein File
'test.py' pasten und ausführen kann.
Dann das Ergebnis in Excel anschauen und sich überlegen warum ...
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

sorry, ich könnte mir gerade selber in den A.... beißen. Es ist eindeutig zu warm.
Jetzt muss ich nur noch rausbekommen wie ich in ein bereits voprhandenes Excel File das reinschreiben kann.
Ich bin dir so dankbar. Schön das es solche Leute gibt. Danke
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Du wirst dafür xlutils brauchen.
https://secure.simplistix.co.uk/svn/xlu ... s/copy.txt
Die Funktion die es zumindest möglich macht.

Sieht etwas wüst aus für dich denke ich, aber da musst jetzt durch.

Gruß
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

hey du hast völlig recht. für einen der wenig Ahnung hat ist das die Hölle. Dafür brauch ich ja Tage bis das klappt. Oh man
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

hallo

ich habe mir den link jetzt mal näher angeschaut
https://secure.simplistix.co.uk/svn/xlu ... s/copy.txt

aber ganz genau verstehe ich das jetzt nicht.
erst schreibe ich meine Messdaten in ein excel file und danach kopiere ich von diesem excel file die messwerte in mein bereits vorhandenes Excel File ????
Net wirklich oder. Es muss doch irgendwie auch direkt in eine bereits erstelltes Excel File gehen, ohne erst was zu kopieren.
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Also das musst Du wissen.

Ich bin davon ausgegangen Du hast ein Excelfile (EF) das Irgendwelche anderen Formeln. Grafiken etc. beinhaltet und meinetwegen zwei Splaten hat (A und B) die Du Grafisch auswertest.

Da mein mini Beispiel das EF immer komplett neu schreibt also alles was vorher da war ist weg, hab ich dir den EF-Copy link geschickt bei dem ein bestehendes EF in ein Workbook-Objekt eingelesen wird, dort kann es geändert werden (Als Beispiel nur deine Spalten A und B) und dann wird es wieder weggeschrieben. So änderst Du etwas an einem bestehenden EF.


Ob Du das brauchst, willst und was auch immer musst Du wissen. Wenn nicht und Du willst einfach nur deine 1000 Messdaten in ein EF schreiben, dann reicht quasi mein mini Beispiel aus.

Wie genau du es aber einbinden musst in deinem Skript weißt du ja eigentlich schon.

Aber so wie da der code ausschaut solltest Du dir noch ein bisschen Grundlagen gönnen :lol:

Das wird es dir am End leichter machen.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

ja genau so etwas benötige ich. in mein Excelfile ist z.B die Spalten A und B für meine Messwerte reserviert. ich probiers jetzt mal
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Also:

Lesen
Kopieren
Manipulieren
Schreiben
Freuen ....
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

ok aber ich muss trotzdem dazu was fragen:

Code: Alles auswählen

from os.path import join
from xlrd import open_workbook
rb = open_workbook(join(test_files,'testall.xls'))   hier öffne ich doch das file mit meinen 5000 Messwerten was ich geschrieben habe oder ? was ist allerdings mit test_files gemeint ???????

rb.sheet_by_index(0).cell(0,0).value    
rb.sheet_by_index(0).cell(0,1).value
#hier lese ich meine Werte die in Spalte A und Spalte B stehen ein. Werden jetzt alle Werte in den Spalten eingelesen oder wird eine Schleife benötigt ? Wofür steht die Null in der Klammer "rb.sheet_by_index(0)" 


from xlutils.copy import copy
wb = copy(rb)
wb.get_sheet(0).write(0,0,'changed!')
# jetzt kopiere ich die  Werte der Spalte A und Spalte B . Auch hier die Frage: die Null in der ersten Klammer "wb.get_sheet(0).write(0,0,'changed!')" und wofür stehen die beiden 0er und 'changed' ?, 

#Before saving the changed workbook to a file:

temp_dir = TempDirectory()
temp_dir.listdir()
wb.save(join(temp_dir.path,'output.xls'))    #output.xls  ist mein ExcelFile, wo die Formeln und Grafiken z.B schon vorhanden sind oder ?
temp_dir.listdir()
output.xls

#benötige ich den Rest weiter unten auch noch. nein. wäre nur, wenn ich über python mir das ergebnis anschauen würde

#This file can now be loaded using xlrd to see the changes:

rb = open_workbook(join(temp_dir.path,'output.xls'))
rb.sheet_by_index(0).cell(0,0).value

rb.sheet_by_index(0).cell(0,1).value


#NB: You should always pass on_demand=True to open_workbook as this
#uses much less memory:

rb = open_workbook(join(test_files,'testall.xls'),on_demand=True)
wb = copy(rb)
Ich hab jetzt mal einige Fragen an den entsprechenden Stellen eingefügt. Schließlich will ich das Programm erst verstehen, bevor ich es anwende. Man ich bin froh wenn das klappt.
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Ich geh jetzt nicht näher auf deine Komentare ein und liefer dir das was Du brauchst.

Jetzt solltest es aber hinbekommen ....

Code: Alles auswählen

from xlrd import open_workbook
from xlutils.copy import copy

# oeffnet ein vorhandenes Excelfile (EF) in dem
# Verzeichnis in dem das Skript ausgefuehrt wird
# mit dem Namen 'example.xls'
# Es ist DEIN job zu schauen das es vorhanden ist
rb = open_workbook('example.xls')
# Kopiert dessen Inhalt in die Variable wb
wb = copy(rb)

# holt dir das erste Sheet (0==null) in dem File um gleich darin zu schreiben
workingSheet_null = wb.get_sheet(0)

# Schreibt in die Zeile 0, Spalte 0 den Wert 'changed!'
# Das ist die Stelle wo Du jetzt deine Werte in Spalte A und B 
# schreiben musst. Wie das geht bekommst du selber hin.
workingSheet_null.write(0,0,'changed!')

# Speichert das ganze wieder in das EF auf die Platte
wb.save('example.xls')

lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

ich benötige das modul functools. Habe allerdings Python 2.4 wo bekomme ich das her ?
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

Ich hab jetzt mal ne Nacht drüber geschlafen würde jetzt mal eine Zusammenfassung schreiben.
Ziel:
ich soll für eine Sereienfertigung Messprozeduren schreiben. Für die Auswertung exiestiert bereits eine Vorlage in Excel die ich benutzen soll. So sollen z.B die Messwerte aus dem ersten Skript (wir sprechen da von 500x2 bis 5000x2 Messwerte) in die Tabelle 1 geschrieben werden, aus dem dem 2. Skript die Messwerte in Tabelle 2 geschrieben usw.
Mein erster Gedanke war ich schreibe die Messwerte in csv Dateien und hole mir nach Beendigung der Messskripte die Messwerte durch manuelles Handling (durch Makros in Excel) nach Excel. Aber ich finde bei einer Serienfertigung sollte der Anwender so wenig wie möglich machen.
Also hab ich mir überlegt die Messwerte direkt in Excel zu schreiben mit win32com usw.... Das klappt auch super. Ich kann meine Exceldatei öffnen, die bestimmte Arbneitsmappe (Tabelle 1 usw.) aktivieren und dort die Werte reinschreiben. Doch bei 5000 Messwerte benötige ich dazu über 8 Minuten. Das ist eindeutig zu lang.
Jetzt bekam ich ein Tipp, ich solle die Messwerte mittels xlwt nach Excel schreiben. Habe ich gemacht und wie gewünscht stehen meine Messwerte in 1 Sekunde in einer Exceldatei. Die Betonung liegt auf "in einer Exceldatei". Ich kann nämlich nicht in ein bereits vorhandenes Excelfile (bestimmte Arbeitsmappe) meine Messwerte reinschreiben. Jetzt hat mir "ichisich" ein Code gegeben (siehe weiter unten gepostet) mit dem es anscheinend klappen soll. Problem nur dabei ist, ich benötige das Modul functools. Da ich aber mit Python 2.4 arbeiten soll, hab ich das gefühl bzw. auch gelesen, dass dieses Modul erst ab der einer höheren Version zur Verfügung steht.
Also sieht für mich die Lage so aus, dass Python für große Messwerte nicht ausgelegt ist (unter diesen Umständen). Oder gibt es doch noch ne Möglichkeit ?
Viele Grüße
lodder
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Also sieht für mich die Lage so aus, dass Python für große Messwerte nicht ausgelegt ist (unter diesen Umständen)
Ich würde eher mal sagen Du bist momentan nicht in der Lage.
Programmieren scheint nicht dein Lieblingsfach zu sein :wink:
Da ich aber mit Python 2.4 arbeiten soll
hmmm....
Warum wenn ich fragen darf ?
Die Zusatzmodule konntest Du ja auch installieren oder !?
Ist zwar nicht das selbe wie eine neue Python Version aber vielleicht kannst es ja durchsetzen !?

Aber:
Ich kann mir beim besten willen auch nicht vorstellen das die paar Werte 8 Minuten brauchen um in einem Excelfile zu landen wenn du über die win32com schnittstelle gehst. Sorry aber 5000 oder 10 000 Werte ist jetzt nicht die Welt. Kannst Du da mal lauffähigen Code posten das man das nachvollziehen kann ?
Ich denke da klemmt es wo anders.
BlackJack

@lodder: Vielleicht reagiere ich jetzt zu sehr als "fanboy", aber vielleicht liegt das nicht an Python sondern an Dir?

Wie schreibst Du denn die Werte über Excel in die Tabelle? Und bitte nicht wieder den Quelltextschnippsel wiederholen der syntaktisch falsch ist und der so mit `n` bzw. `m` sicher nicht funktioniert wie er sollte. Wobei man allerdings selbst an diesem Schnippsel sieht, dass man da mal versuchen könnte die ganzen Sachen, die pro Schleifendurchgang immer wieder gemacht werden, aber zum gleichen Ergebnis führen, mal aus der Schleife heraus zieht.

Vielleicht eher stilistisch, aber die ``while``-Schleife sieht mir auch eher nach einem Kandidaten für eine ``for``-Schleife aus.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

Ja stimmt, programmieren gehört nicht zu meinen Stärken. Aber ich muss es halt jetzt machen. Ich bin für jede Anregung, Kritik dankbar. Nur so kann man was lernen. Hier jetzt mal der Code:

Code: Alles auswählen

from PyCecs.FunctionHelper import *
from PyCecs.TableFile import *
from PyCecs.GpibDevice.SigGenerator import *
from PyCecs.GpibDevice.PowerMeter import *
from PyCecs.GpibDevice.SpectrumAnalyzer import *
from PyCecs.PropertyFile import *
from PyCecs.MeasurementHelper import *
from PyCecs.HPABUC import *
from PyCecs.WaveGuideSwitch import *
from PyCecs.PyGUI import *
import win32com
import win32com.client
from win32com.client import Dispatch

###############################################################################################
# Legend
#   n   =   integer variable
#   s   =   string variable
#   f   =   float variable
#   b   =   bool variable
###############################################################################################
oMessage = CPyHpaGUI(True)
oMeasProperties = CPropertyFile("PHASE_NOISE_MEASUREMENT_30_06_10")

try:
    oMessage.setPyProgressbar(0)
    nMenuDelay = 2000

######Select measurement instruments###############################################

    #open excel file
    xlApp = Dispatch("Excel.Application")
    xlApp.Workbooks.Open("C:\qwertz.xls")
    xlApp.Visible = 0

    #select the spectrum analyzer
    sSpecGPIBAddr = str(oMeasProperties.getPropertyValue("SpecGPIBAddrRS"))
    oTestSpec = CGpibDevice()
    if not oTestSpec.setGPIBAddress(sSpecGPIBAddr):
        sSpecGPIBAddr = str(oMeasProperties.getPropertyValue("SpecGPIBAddrHP"))
        oSpec = CSpectrumAnalyzerHP()
        if not oSpec.setGPIBAddress(sSpecGPIBAddr):
            oMessage.printPyMessageException("No connection with the spectrum analyzer")
    else:
        oSpec = CSpectrumAnalyzerRohdeSchwarz(sSpecGPIBAddr)

    fOutFreq = 8.15

    # get essential Rohde&Schwarz property values
    nSpecRfAtt = int(oMeasProperties.getPropertyValue("R&SRfAtt"))
    nSpecRefLevel = int(oMeasProperties.getPropertyValue("R&SRefLevel"))
    nSpecSpanFreq = int(oMeasProperties.getPropertyValue("R&SSpanFreq"))
    sSpecHardCopyPath = str(oMeasProperties.getPropertyValue("R&SHardCopyPath"))
    sMeasRecallFile = str(oMeasProperties.getPropertyValue("R&SMeasRecallFile"))

    #oMessage.printPyMessage("Spektrumanalyzer wird fuer Phasenrauschen-Messung eingestellt")
    oMessage.printPyMessage("Configure spectrum analyzer for phasenoise")
    oSpec.doPreset()
    oSpec.setDisplayUpdate(True)
    oMessage.setPyProgressbar(68)
    if not oSpec.setCenterFrequency(fOutFreq, VALENCY.Giga):
        oMessage.printPyMessageException("Spec: Unable to set center frequency")
    if not oSpec.setRfAttenuationManual(nSpecRfAtt):
        oMessage.printPyMessageException("Spec: Unable to set Rf attenuation")
    if not oSpec.setRefLevel(nSpecRefLevel):
        oMessage.printPyMessageException("Spec: Unable to set reference level")
    if not oSpec.setSpanFrequency(nSpecSpanFreq, VALENCY.Mega):
        oMessage.printPyMessageException("Spec: Unable to set span frequency")
    if not oSpec.setSweepMode(SWEEPMODES.Single):
        oMessage.printPyMessageException("Spec: Unable to set sweep mode")
    oSpec.setDisplayUpdate(True)
    if not oSpec.Recall(sMeasRecallFile):
        oMessage.printPyMessageException("Spec: Unable to recall config file")
    if not oSpec.setCenterFrequency(fOutFreq, VALENCY.Giga):
        oMessage.printPyMessageException("Spec: Unable to set center frequency")


    #get the values from spectrum analyzer to write in the csv data
    fReadRefLevel = oSpec.getRefLevel()
    fReadStartFreq = oSpec.getStartFrequency()
    fReadStopFreq = oSpec.getStopFrequency()
    fReadLog = 10.0

    oMessage.printPyMessage("Start phasenoise measurement")


    oSpec.setGPIBTimeout(300)
    Worker.Unlock()
    oMessage.setPyProgressbar(70)
    oMessage.printPyMessage("Data transfer to computer")
    oSpec.doStartAction()
    sTraceData = oSpec.getASCIIFormat()
    Worker.Lock()
    Worker.SleepUnlocked(1000)
    fListTraceData = makeFloatList(sTraceData)
    oMessage.setPyProgressbar(73)

    j = len(fListTraceData)
    i = 0
    n = 0
    z = 18
    #write the trace data in csv file
    Worker.Unlock()
    oMessage.printPyMessage("write trace data in excel")
    while(i<j):
        Worker.SleepUnlocked(1)
        contents = ([float(fListTraceData[i+1]), float(fListTraceData[i])])
        for v, content in enumerate(contents):
            xlApp.ActiveWorkbook.Sheets(sPathNameExcel).Cells(z, v+1).Value = content
        i += 2
        z += 1
    Worker.Lock()
        

    xlApp.ActiveWorkbook.Save()
    xlApp.Workbooks.Close()
    oMessage.setPyProgressbar(100)

except Exception, error:
    oMessage.printPyMessage(str(error))
    xlApp.ActiveWorkbook.Save()
    xlApp.Workbooks.Close()
    raise Exception, error
Zuletzt geändert von Anonymous am Freitag 2. Juli 2010, 10:28, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

ich hab gerade gesehen, dass für sPathNameExcel = Tabelle 1 stehen müsste und natürlich wird das nicht mehr in eine csv-Datei geschrieben. Alles vor "oMessage.printPyMessage("Start phasenoise measurement")" sind nur Voreinstellungen.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

Jetzt kommt auf einmal immer diese Fehlermeldung sobald ich die Werte in Excel schreibe.
"Exception occurred" dies wird mir in meiner GUI angezeigt. Warum ging das die ganze Zeit und jetzt nicht mehr ?
Antworten