Python字典到CSV Issu

2024-10-03 21:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个python脚本来清理CSV文件。重新格式化工作正常,但写入程序写入新CSV文件的数据行是错误的。我正在构建一个包含所有行数据的字典,然后再使用writer.writerows文件(). 当我使用print语句检查字典时,正确的数据会附加到列表中。但是,附加之后,字典中会出现不正确的值。你知道吗

import csv

data = []
with open(r'C:\\Data\\input.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    street_fields = []                                  # Store new field names in list
    street_fields.append("startdate")
    street_fields.append("starttime")
    street_fields.append("sitecode")
    street_fields.append("recordtime")
    street_fields.append("direction")
    street_fields.append("turnright")
    street_fields.append("wentthrough")
    street_fields.append("turnleft")
    street_fields.append("pedestrians")
    for row in csv_reader:                              # Read input rows
        if line_count == 0:
            startdate = row[1]                          # Get Start Date from B1
            line_count += 1
        elif line_count == 1:
            starttime = row[1]                          # Get Start Time from B2
            line_count += 1
        elif line_count == 2:
            sitecode = str(row[1])                      # Get Site code from B3
            line_count += 1
        elif line_count == 3:
            street_count = len(row) - 3                 # Determine number of streets in report
            streetnames = []
            i = 1
            while i < street_count:
                streetnames.append(row[i])              # Add streets to list
                i += 4
            line_count += 1
        elif line_count > 4:
            street_values = {}                          # Create dictionary to store new row values
            n = 1
            for street in streetnames:
                turnright = 0 + n                                       
                wentthrough = 1 + n
                turnleft = 2 + n
                pedestrians = 3 + n
                street_values["startdate"] = startdate
                street_values["starttime"] = starttime
                street_values["sitecode"] = sitecode
                street_values["recordtime"] = row[0]
                street_values["direction"] =  street
                street_values["turnright"] = int(row[turnright])
                street_values["wentthrough"] = int(row[wentthrough])
                street_values["turnleft"] = int(row[turnleft])
                street_values["pedestrians"] = int(row[pedestrians])
                data.append(street_values)                                  # Append row dictionary to list
                #print(street_values)                                       ### UNCOMMENT TO SEE CORRECT ROW DATA ###
                #print(data)                                                ### UNCOMMENT TO SEE INCORRECT ROW DATA ###
                n += 4
            line_count += 1
        else:
            line_count += 1
with open(r'C:\\Data\\output.csv', 'w', newline='', encoding="utf-8") as w_scv_file:
    writer = csv.DictWriter(w_scv_file,fieldnames=street_fields)
    writer.writerow(dict((fn,fn) for fn in street_fields))                  # Write headers to new CSV
    writer.writerows(data)                                                  # Write data from list of dictionaries

创建的词典列表(JSON)示例:

[  
   {  
      "startdate":"11/9/2017",
      "starttime":"7:00",
      "sitecode":"012345",
      "recordtime":"7:00",
      "direction":"Cloud Dr. From North",
      "turnright":0,
      "wentthrough":2,
      "turnleft":11,
      "pedestrians":0
   },
   {  
      "startdate":"11/9/2017",
      "starttime":"7:00",
      "sitecode":"012345",
      "recordtime":"7:00",
      "direction":"Florida Blvd. From East",
      "turnright":4,
      "wentthrough":433,
      "turnleft":15,
      "pedestrians":0
   },
   {  
      "startdate":"11/9/2017",
      "starttime":"7:00",
      "sitecode":"012345",
      "recordtime":"7:00",
      "direction":"Cloud Dr. From South",
      "turnright":15,
      "wentthrough":4,
      "turnleft":6,
      "pedestrians":0
   },
   {  
      "startdate":"11/9/2017",
      "starttime":"7:00",
      "sitecode":"012345",
      "recordtime":"7:00",
      "direction":"Florida Blvd. From West",
      "turnright":2,
      "wentthrough":219,
      "turnleft":2,
      "pedestrians":0
   },
   {  
      "startdate":"11/9/2017",
      "starttime":"7:00",
      "sitecode":"012345",
      "recordtime":"7:15",
      "direction":"Cloud Dr. From North",
      "turnright":1,
      "wentthrough":3,
      "turnleft":8,
      "pedestrians":0
   }
]

实际写入CSV的内容: enter image description here

注意方向字段和数据行不正确。由于某种原因,当它在streetnames列表中循环时,最后一个街道名称和相应的行值将在单个记录时间内保持不变。你知道吗

在重新分配变量值之前,是否需要删除变量?你知道吗


Tags: csvstreetfieldscountlinerowvaluesstarttime
1条回答
网友
1楼 · 发布于 2024-10-03 21:25:58

看起来您正在一次又一次地将同一本词典添加到列表中。你知道吗

一般来说,在列表中添加一个单独的字典时,我会使用mylist.append(mydict.copy()),否则稍后在同名字典中指定新值时,实际上只是更新旧字典,包括列表中指向同名字典的条目(请参见mutable vs immutable objects in python)。你知道吗

简而言之:如果希望列表中的字典与新字典是一个单独的实体,请在将它附加到列表时使用dict.copy()创建一个深度副本。你知道吗

相关问题 更多 >