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.
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 ?
BlackJack

@lodder: Was ist ``Worker.SleepUnlocked(1)``? Kann es sein, dass da die Zeit bleibt?

Was ist mit dem ganzen unnötigen Arbeiten innerhalb der ``while``-Schleife? Warum sind die `float()` aufrufe nötig`? Man muss nicht jedesmal das "Arbeitsblatt" neu anfordern, das ändert sich ja nicht. Der Wert von `z` lässt sich relativ zu `i` angeben und für die ``while``-Schleife kann man auch eine ``for``-Schleife schreiben. Ungetestet:

Code: Alles auswählen

    #write the trace data in csv file
    Worker.Unlock()
    oMessage.printPyMessage('write trace data in excel')
    sheet = xlApp.ActiveWorkbook.Sheets(sPathNameExcel)
    for i in xrange(len(fListTraceData) / 2):
        Worker.SleepUnlocked(1)     # XXX: Why?
        contents = [fListTraceData[i * 2 + 1], fListTraceData[i * 2]]
        for v, value in enumerate(contents):
            sheet.Cells(i + 18, v + 1).Value = value
    Worker.Lock()
Ich bin jetzt nicht so der Excel-Experte, aber ich dachte es gibt auch die Möglichkeit sich Zellenbereiche geben zu lassen und denen Sequenzen zuzuweisen statt jeder Zelle einzeln einen Wert zu geben. Vielleicht ist das schneller.
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

Hallo BlackJack
der Befehl Worker.SleepUnlocked() dient dazu das Skript über die GUI abzubrechen. Hab ich aber jetzt mal weggelassen.
Dieser Fehler wird mir angezeigt:
(-2147352567,'Exception occurred',(0,None,None,None, 0, -2146827284),None)

was soll das den bedeuten ?
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Das bedeutet das ein Fehler aufgetreten ist .....

Mal im ernst, wie und warum soll das jemand einfach so wissen ....

Wo und wann tritt der Fehler auf ?
Kannst Du das Skript auf der Konsole ausführen und siehst dann noch andere Fehlermeldungen ?

Wie testest Du das ?
Kopierst Du immer den Quellcode und läßt es laufen und wenns nicht tut Fehlermeldung posten ?
Kann so nicht ganz gehen, bisschen Eigeninitiative und bisschen Fantasie beim Debuggen deiner Anwendung ...

So jetzt leg dir mal nen Eiswürfel auf den Kopf und dann läufts ;-)
Antworten