如何在CSV中打印搜索字符串的第二列?



我正在尝试在CSV中搜索文件名(在A列中(。如果找到它,那么我只想打印第二列(B 列(,而不是整行。

CSV 是这样的:

File Name,ID
1234.bmp,1A
1111.bmp,2B

这是我到目前为止所拥有的,但它打印了两列:

import os
import csv
f_name = os.listdir(r'C:UsersPeterDocumentsPython testFiles')[0]
data = []
with open ("test.csv") as csvfile:
reader = csv.reader(csvfile)
for row in reader:
data.append(row)
col = [x[0] for x in data]
if f_name in col:
for x in range(len(data)):
if f_name ==data[x][0]:
action = print(data[x])
else:
print("File not listed")

你很接近。您只是索引(和print语句(有问题。

在代码的这一部分之后:

data = []
with open ("test.csv") as csvfile:
reader = csv.reader(csvfile)
for row in reader:
data.append(row)

data现在将是一个列表列表:

[ 
['File Name', 'ID'], 
['1234.bmp', '1A'], 
['1111.bmp', '2B']
]

在检查第一列的部分:

if f_name == data[x][0]:
action = print(data[x])

您打印了data[x]这将是一行。您需要进一步索引它才能访问第二列:

print(data[x])     # ['1234.bmp', '1A']
print(data[x][1])  # 1A

此外,print返回None,因此None将被保存到action

>>> action = print("123")
123
>>> print(action)
None

您需要将值分配给action然后print(action)

if f_name == data[x][0]:
action = data[x][1]
print(action)  # 1A or 2B

您还可以通过消除col来进一步改进代码。我知道这是为了检查f_name是否在 CSV 的第一列("文件名"(中。由于您已经在迭代每个row,因此您已经可以在那里检查f_name是否在row中。如果找到它,将该行的索引存储在变量中(例如。idx_fname_in_csv(,以便以后可以直接从data访问它。这消除了额外的变量col,并避免了两次迭代数据。

import os
import csv
f_name = os.listdir(r'C:UsersPeterDocumentsPython testFiles')[0]
data = []
idx_fname_in_csv = -1  # invalid
with open("test.csv") as csvfile:
reader = csv.reader(csvfile)
for idx, row in enumerate(reader):
data.append(row)
if f_name in row:
idx_fname_in_csv = idx
if idx_fname_in_csv > 0:
action = data[idx_fname_in_csv][1]
print(action)
else:
print("File not listed")

在这里data仍然具有相同的内容(列表列表(,但我使用enumerate来跟踪索引。

最新更新