如何读取 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
我有很多来自传感器的实时数据。目前,我将数据存储在一个 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