从csv文件中提取特定行

时间:2018-05-22 08:33:24

标签: python python-2.7 csv file-io

我有包含原始信号的文件。文件从第一列开始,时间是'时间'第二个是'信号'。

由于时间跨度约为20小时,时间跨度为10毫秒,因此大约有800万行。

我想从各种“开始”文件中提取特定的数据块。并且'停止'次。

我设法得到了一些东西。这是我的代码:

B

'开始'并且'停止'时间以秒为单位。

0时间' 0' 360处于' 6分钟'标记,等等。

我想要运行数据并将数据分组为半秒的时间段,因此 SELECT A.[id], Split.a.value('.', 'VARCHAR(100)') AS String FROM (SELECT [id], CAST ('<M>' + REPLACE(DataVal, ';', '</M><M>') + '</M>' AS XML) AS String FROM testtabl) AS A CROSS APPLY String.nodes ('/M') AS Split(a); 部分,并将此列表写入另一个csv文件。

我的代码&#39;技术上&#39;作品。如果我从start = 0开始我的程序开始并且从我的数据文件中停止= 0.5:

import csv

#Constructs arrays of length 500 ms from raw signals
def constructor(filename, new_file, start, stop, label):
    with open(filename, 'rb') as fileRead:
        reader = csv.reader(fileRead, delimiter=',')
        for row in reader:
            if float(row[0]) == float(start):
                while float(row[0]) != float(stop):
                    array = []
                    for i in range(50):
                        array.append(row[1])
                        row = next(reader)
                    with open(new_file, 'ab') as fileWrite:
                        array.append(label)
                        writer = csv.writer(fileWrite)
                        writer.writerow(array)
            else:
                continue

constructor('SC4001E0-PSG_FPZ-CZ.csv', 'new.csv', 0, 1, 0)
constructor('SC4001E0-PSG_FPZ-CZ.csv', 'new.csv', 30630, 30750, 1)

我明白了:

for i in range(50)

这正是我想要的但有时我的开始&#39;并且&#39;停止&#39;时间可以变化很大。如果我运行0 5.01685 0.01 -2.578755 0.02 1.359707 0.03 -2.391209 0.04 -5.204396 0.05 -7.454945 0.06 -8.298901 0.07 -6.892308 0.08 -3.704029 0.09 -0.984615 0.1 2.203663 0.11 2.016117 0.12 1.641026 0.13 -2.672527 0.14 -0.79707 0.15 1.359707 0.16 2.860073 0.17 -2.203663 0.18 0.515751 0.19 5.860806 0.2 -1.734799 0.21 -3.047619 0.22 2.860073 0.23 7.830037 0.24 2.953846 0.25 -0.984615 0.26 -1.922344 0.27 -6.704762 0.28 -7.548718 0.29 -4.829304 0.3 -12.612454 0.31 -9.23663 0.32 -12.331136 0.33 -8.298901 0.34 -16.36337 0.35 -21.145788 0.36 -23.677656 0.37 -21.23956 0.38 -20.208059 0.39 -23.771429 0.4 -26.115751 0.41 -25.646886 0.42 -26.115751 0.43 -26.678388 0.44 -22.8337 0.45 -22.458608 0.46 -21.520879 0.47 -16.644689 0.48 -16.082051 0.49 -11.393407 代码行......没有任何反应。好像Python脚本因为开始时间太远而得以上升。

我运行这些函数的原因是我拥有它的方式,因为我需要在不同的时间处理所有不同的数据块。所有这些数据块都有相应的标签。

范围240s到350s的数据可以是标签2。 范围56000s到62130s的数据可以是标签1等。我想要所有这些列表或时期,以及在新的csv文件上的相应标签。

我理解,每次运行该功能时,都会在“开始”中进行。时间这么大,意味着该函数开始做一些冗余的过程,不得不重新打开并重新读取数据文件。

有没有人有任何建议?有谁知道为什么脚本会停止在那里开始&#39;开始&#39;次?

感谢您的时间。

编辑: 我发现了我的错误。它碰巧是100%的用户错误。我的脚本没有提取更多5.01685 -2.578755 1.359707 -2.391209 -5.204396 -7.454945 -8.298901 -6.892308 -3.704029 -0.984615 2.203663 2.016117 1.641026 -2.672527 -0.79707 1.359707 2.860073 -2.203663 0.515751 5.860806 -1.734799 -3.047619 2.860073 7.830037 2.953846 -0.984615 -1.922344 -6.704762 -7.548718 -4.829304 -12.612454 -9.23663 -12.331136 -8.298901 -16.36337 -21.145788 -23.677656 -21.23956 -20.208059 -23.771429 -26.115751 -25.646886 -26.115751 -26.678388 -22.8337 -22.458608 -21.520879 -16.644689 -16.082051 -11.393407 0 值的行的原因是因为那里没有数据开始。我的文件太大了,Excel在Excel达到极限后切断了文件中剩余的数据。

除了对我的代码添加和更改很少外,它的效果很好。因此,如果有人想将它作为参考,那就是它。

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

from itertools import dropwhile, takewhile
import csv

#Constructs arrays of length 500 ms from raw signals
def constructor(filename, new_file, start, stop, label):
    with open(filename, 'rb') as f_input, open(new_file, 'wb') as f_output:
        csv_input = csv.reader(f_input)
        csv_output = csv.writer(f_output)
        block = []

        for row in takewhile(lambda r: float(r[0]) < stop, dropwhile(lambda r: float(r[0]) < start, csv_input)):
            if len(block) == 50:
                csv_output.writerow(block + [label])
                block = []
            block.append(row[1])

        # This would write any remaining entries but label would not be in the same column
        csv_output.writerow(block + [label])   

constructor('input.csv', 'new1.csv', 0.0, 1.0, 0)
constructor('input.csv', 'new2.csv', 30630.0, 30750.0, 1)   

这使用itertools.dropwhile()itertools.takewhile()来首先过滤掉感兴趣的行。接下来,它会附加值,直到达到50,然后将块写入输出文件。

注意,最终.writerow()将输出任何剩余值。随附label,它可能不在同一列中。我建议您将标签作为第一列,例如[label] + block