所有列表项都在Python中更改为附加项

时间:2016-07-15 21:00:04

标签: python list file object datatable

我使用的是Python 2.7,只使用标准模块。

我有一个庞大的数据文件,其中包含大量有关汽车事件的信息。我正在尝试复制有关单个汽车事件类型的数据(例如加速)并将其写入单独的文件。我当前的方法将数据存储在一个表中 - 我在列表中使用了列表 - 然后将其写入单独的文件(参见下面的示例表)。

Event Type | Data Location Start | Data Location End 
--------------------------------------------
Accelerate | 99                  | 181
Break      | 182                 | 263 
Horn       | 264                 | 351
Accelerate | 352                 | 434
...and so on

The table above in Python would be:

event_list = [['Accelerate', 99, 181], 
              ['Break', 182, 263], 
              ['Horn', 264, 351],
              ['Accelerate', 352, 434]]

问题:每次我追加一行时,所有其他行都会更改为该追加的行。我在下面提供了我的代码和控制台输出。

#!/usr/bin/python    
""" File Description """

import os

def main():
    """ Organize Car Data Into New File """

    event_list = []             # This is the entire table
    first_event = True          # This is a flag
    single_event = [-1, -1, -1] # This is a single row in the table
                                # [Event Name, Code Line Start, Code Line End]

    with open('C:/car_event_data.dat', 'rb') as f:
        line = '-1'

        while line != '':                           # If line = '' then it is EOF
            line = f.readline()
            if line[0:6] == 'Event:':
                if first_event == False:            
                    single_event[2] = f.tell() - 1  # Code Line End
                    event_list.append(single_event) # Completed row
                    print(event_list)
                end = line.find('\x03', 6)          # Find the end location of Event Type
                single_event[0] = line[6:end]       # Event Type
                single_event[1] = f.tell()          # Code Line Start
                first_event = False

        f.seek(0, os.SEEK_END)                      # Put pointer at EOF
        single_event[2] = f.tell()
        event_list.append(single_event)

if __name__ == '__main__':
    main()

上面的代码生成以下输出:

[['Accelerate', 99, 181]]
[['Break', 182, 263], ['Break', 182, 263]]
[['Horn', 264, 351], ['Horn', 264, 351], ['Horn', 264, 351]]
... and so on

1 个答案:

答案 0 :(得分:1)

List对象在Python中通过引用传递。之前附加的元素变异到当前行的原因是因为它们都指向同一个列表single_event。

一个简单的

single_event = list(range(3))

每次追加操作后都应解决您的问题。