如何读取 csv 文件中的特定列?

How to read specific columns in the csv file?

我有很多来自传感器的实时数据。目前,我将数据存储在一个 csv 文件中,如下所示:

0  2  1  437   464  385  171    0:44:4   dog.jpg
1  1  3  452   254  444  525    0:56:2   cat.jpg
2  3  2  552   525  785  522    0:52:8   car.jpg
3  8  4  552   525  233  555    0:52:8   car.jpg
4  7  5  552   525  433  522    1:52:8   phone.jpg
5  9  3  552   525  555  522    1:52:8   car.jpg
6  6  6  444   392  111  232    1:43:4   dog.jpg
7  1  1  234   322  191  112    1:43:4   dog.jpg
.
.

。 .

第三列的数字介于 1 到 6 之间。我想读取第三列中数字为 2 和 5 的所有行的第 4 列和第 5 列的信息。我还想每 2 秒将它们逐行写入另一个 csv 文件,一次一行。 我这样做是因为我有另一个代码可以遍历数据并从那里读取数据。我想知道如何为第 3 列中包含 3 和 5 的行编写信息?请指教!

例如:

2  552   525  
5  552   525  
......
......
.....

.

import csv

with open('newfilename.csv', 'w') as f2:
    with open('mydata.csv', mode='r') as infile:
        reader = csv.reader(infile)  # no conversion to list
        header = next(reader)  # get first line
        for row in reader:  # continue to read one line per loop

            if row[5] == 2 & 5:

我认为您只需更改 if 语句即可获得所需的行。

例如:

import csv

with open('newfilename.csv', 'w') as f2:
    with open('mydata.csv', mode='r') as infile:
        reader = csv.reader(infile)  # no conversion to list
        header = next(reader)  # get first line
        for row in reader:  # continue to read one line per loop

            if row[5] in [2,5]:

在 if 中,您将得到具有 2 或 5

的行

第三列的索引为 2,因此您应该检查 row[2] 是否是 '2''5' 之一。我通过定义集合 select = {'2', '5'} 并检查是否 row[2] in select.

来完成此操作

我没看到您使用 header 做什么,但我假设您有更多代码在某处处理 header。如果您不需要 header 并且只想跳过第一行,只需执行 next(reader) 而不将其分配给 header 但我在我的代码中保留了 header假设您稍后使用它。

我们可以使用 time 模块中的 time.sleep(2) 来帮助我们每 2 秒写一行。

下面,"in.txt" 是包含您提供的示例输入的 csv 文件,"out.txt" 是我们写入的文件。

代码

import csv
import time

select = {'2', '5'}
with open("in.txt") as f_in, open("out.txt", "w") as f_out:
    reader = csv.reader(f_in)
    writer = csv.writer(f_out)
    header = next(reader)    
    for row in reader:
        if row[2] in select:
            print(f"Writing {row[2:5]} at {time.time()}")
            writer.writerow(row[2:5])
            # f_out.flush() may need to be run here
            time.sleep(2)

输出

Writing ['2', '552', '525'] at 1650526118.9760585
Writing ['5', '552', '525'] at 1650526120.9763758

"out.txt"

2,552,525
5,552,525

输入

"in.txt"

0,2,1,437,464,385,171,0:44:4,dog.jpg
1,1,3,452,254,444,525,0:56:2,cat.jpg
2,3,2,552,525,785,522,0:52:8,car.jpg
3,8,4,552,525,233,555,0:52:8,car.jpg
4,7,5,552,525,433,522,1:52:8,phone.jpg
5,9,3,552,525,555,522,1:52:8,car.jpg
6,6,6,444,392,111,232,1:43:4,dog.jpg
7,1,1,234,322,191,112,1:43:4,dog.jpg