簡體   English   中英

Python 2.7以.csv格式導出數據

[英]Python 2.7 exporting data in a .csv

我有這段代碼用於從串口連接的機器收集數據,然后重新排序數據。 我可以在最后成功打印我的數據: print pigment_data

但是,我不知道如何將此數據導出.csv文件。

有沒有直接的方法來做到這一點?

非常感謝你,

阿德里安

import serial  # requires pyserial library
import csv

ser  = serial.Serial(0)
data = []

while True:
    name = raw_input("Pigment name [DONE to finish]: ")
    if name == "DONE":
        break

    pigment_data = []
    first = True
    main_spect = []

    while True:
        line = ser.readline()
        if first:
            print "  Data incoming..."
            first = False
        split = line.split()
        if 10 <= len(split):
            try:
                wavelength = int(split[0])
                measurements = [float(split[i]) for i in [2,4,6,8,10]]
                pigment_data.append({"wavelength": wavelength,
                                     "measurements": measurements})
                main_spect.append(measurements[2])
            except ValueError:
                pass    # handles the table heading
        if line[:3] == "110":
            break
    data.append({"name": name,
                 "data": pigment_data})
    print "  Data gathered."
    print pigment_data

    # here's the problem:
    with open('spectral_data.csv', 'wb') as f:
        writer = csv.writer(f)
        writer.writerows(pigment_data)

你收集了一個字典列表,在這里使用csv.DictWriter()來改善它:

with open('spectral_data.csv', 'ab') as f:
    writer = csv.DictWriter(f, ('name', 'data'))
    writer.writerow(data[-1])

這也會以append-mode打開文件,因為每次循環都會打開一次文件。 我在這里使用了data[-1] ,因為這是你在循環中添加的最后一個條目。

您可能希望將writer對象的創建移出循環:

with open('spectral_data.csv', 'wb') as f:
    writer = csv.DictWriter(f, ('name', 'data'))

    while True:
        name = raw_input("Pigment name [DONE to finish]: ")
        # ....

        print pigment_data

        writer.writerow(data[-1])

它會在您收集CSV文件時將您收集的最新條目寫入。

最后但並非最不重要的是,您還可以在外部后一次寫入整個data列表, while True:完成:

data = []

while True:
    name = raw_input("Pigment name [DONE to finish]: ")
    # ....

with open('spectral_data.csv', 'ab') as f:
    writer = csv.DictWriter(f, ('name', 'data'))
    writer.writerows(data)

來自csv.writer的幫助:

writer(...)
    csv_writer = csv.writer(fileobj [, dialect='excel']
                                [optional keyword args])
        for row in sequence:
            csv_writer.writerow(row)

        [or]

        csv_writer = csv.writer(fileobj [, dialect='excel']
                                [optional keyword args])
        csv_writer.writerows(rows)

    The "fileobj" argument can be any object that supports the file API.

所以基本上你想要:

with open('spectral_data.csv', 'wb') as f:
    writer = csv.writer(f)
    for row in pigment_data:
        writer.writerow(row)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM