我正在尝试在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
来跟踪索引。