【问题标题】:Python - csv - Error: Sequence ExpectedPython - csv - 错误:预期序列
【发布时间】:2012-04-22 20:11:18
【问题描述】:

我正在尝试使用 python csv 模块将字典写入 csv 文件。

我的字典看起来像这样:

{'PCIP': '192.168.1.4', 'DutIP': '192.168.1.6', 'timestamp': '20120410100340', 'start_time': '0.0', 
 'Transfer bytes': '59457090', 'Port': '5763', 'Lost Datagrams': '10575', 'Percent Lost Datagrams': 
 '20.727', 'PER': 20.727, 'Bandwidth bits': '51684334', 'Throughput': 51.684334, 'end_time': '9.2', 
 'Unknown': '41710', 'Jitter': '0.017', 'ID': '3', 'Total Datagrams': '51020'}

我在尝试编写时收到错误sequence expected

有什么办法吗?

def save_result_to_csv_file(self, file, data, header="", access_mode='ab'):
    """
    :param file: local file_name for csv-format logfile
    :type file: str
    :param data: a list or other datatype supported by csv.writerow() 
    :type data: list
    :param header: list containing row names
    :type header: list
    :param access_mode: 'a' append, 'w' write, 'ab' binary append, 'wb' binary write, 'r' read
    :type access_mode: str
    """
    #if file does not exist, start by writing the header row.

    log_file_obj = open(file, 'ab') 
    log_file_writer = csv.writer(log_file_obj)
    if not os.path.isfile(file):
        log_file_writer.writerow(header)
    log_file_writer.writerow(data)
    log_file_obj.flush()
    log_file_obj.close()

     # Labels (Compare to test_case_log_row definition, which matches row_labels)
    interval_data_labels = ["timestamp", "DutIP", "Port", "PCIP", "Unknown", "ID", "start_time", "end_time", "Transfer bytes", "Bandwidth bits"]
    summary_data_labels = interval_data_labels + ["Jitter", "Lost Datagrams", "Total Datagrams", "Percent Lost Datagrams"]
    timestamp_label = ["timestamp"]
    device_info_labels = [ "Device", "Device OS", "Device Bundle"]
    test_results_labels = ["Throughput (MBits/s)", "PER"]
    test_parameters_labels = ["pD.protocol", "pD.test_direction", "pD.execution_time", "pD.send_rate", "pD.packet_size", "pD.transfer_amount"]
    test_data_raw_labels = summary_data_labels
    row_labels = timestamp_label + device_info_labels + test_parameters_labels + test_results_labels + test_data_raw_labels

【问题讨论】:

  • 在提出此类问题时发布您尝试过的代码会很有帮助。
  • 在编写字典时,是否在构造函数中将字段名称指定为标题字段?只有在这种情况下,才能由 csv.writerow() 直接写出字典 - 如果您不设置标题名称(即字段名称的顺序),则 writerow() 将拒绝编写字典。
  • 是的,发布代码,我敢打赌,你的函数参数顺序错误。
  • 我们的意思是您必须将您正在写入的代码发布到 csv。我猜你没有使用csv.DictWriter

标签: python file csv dictionary


【解决方案1】:

您可以改用DictWriter 对象:

import csv

row = {'PCIP': '192.168.1.4', 'DutIP': '192.168.1.6', 'timestamp': '20120410100340', 'start_time': '0.0', 'Transfer bytes': '59457090', 'Port': '5763', 'Lost Datagrams': '10575', 'Percent Lost Datagrams': '20.727', 'PER': 20.727, 'Bandwidth bits': '51684334', 'Throughput': 51.684334, 'end_time': '9.2', 'Unknown': '41710', 'Jitter': '0.017', 'ID': '3', 'Total Datagrams': '51020'}

fp = open('/path/to/file', 'wb')
writer = csv.DictWriter(fp, fieldnames=row.keys())
writer.writerows([row])

注意 row.keys() 中字段名称的顺序。

【讨论】:

    【解决方案2】:

    这个 sn-p 在 2.7 中可以正常工作

    import csv
    
    my_dict =  {'PCIP': '192.168.1.4', 'DutIP': '192.168.1.6', 'timestamp': '20120410100340', 'start_time': '0.0', 
    'Transfer bytes': '59457090', 'Port': '5763', 'Lost Datagrams': '10575', 'Percent Lost Datagrams': 
    '20.727', 'PER': 20.727, 'Bandwidth bits': '51684334', 'Throughput': 51.684334, 'end_time': '9.2', 
    'Unknown': '41710', 'Jitter': '0.017', 'ID': '3', 'Total Datagrams': '51020'}
    
    writer = csv.writer(open("some.csv", "wb"))
    
    writer.writerows(my_dict.viewitems())
    

    如果有必要在标题和列中使用键作为应该使用的值

    writer.writerow(list(my_dict.viewkeys()))
    writer.writerow(list(my_dict.viewvalues()))
    

    【讨论】:

    • 可能,您使用的是 writerow() 而不是 writerows() - 这导致了“预期序列”错误。
    • csv 文件长什么样子?
    • 我想要的是作为键的标题和作为值的列。这可能吗?
    • 标头显示正确,但字段显示如下: ('PCIP', '192.168.1.4') ('DutIP', '192.168.1.6') ('timestamp', '20120410113158' )
    • 这行不通!由于在 Python 中 dicts 每次 OP 调用 save_result_to_csv_file 时都没有顺序,data 可能会以不同的顺序写入。作为@Greg Leclercq 的回答,以及我对这个问题的评论。看看csv.DictWriter
    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2011-02-08
    • 2012-09-05
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多