我有一个csv文件,其中包含有关我们网络上某些计算机的信息。我希望能够从命令行输入一个快速行,以便从csv中返回相关项目。格式为:
$ tag.py *hostname*
csv有大约50列,信息范围从MAC地址到网络上最后一次。我只想在搜索时输出这些列的选择。我已经编写了必要的代码,但它确实有用。但是我希望搜索更灵活。就目前而言,搜索词必须与我正在搜索的值完全相同。又名
$ tag.py mycomputer # This returns nothing
$ tag.py mycomputer.co.uk # This returns the information I want
$ tag.py 63746 # This returns nothing
$ tag.py 00063746 # This returns the information I want
现在我已经有了代码。
# Import Modules
import sys
import csv
# Get user Input
# I assume the script is used in the form script.py "search-term"
# If no input added to command, ask for user input
if len(sys.argv) < 2:
print("Please enter a hostname or asset number.")
search_1 = input("Search for:")
else:
search_1=sys.argv[1]
# Setup Variables
# Open cvs and setup csv.reader settings
csvfile = open("file.csv", "r", encoding="Latin-1")
csvfile.seek
reader = csv.reader(csvfile, dialect='excel', delimiter=",", quotechar="'")
# Search cvs for the input string
for line in reader:
if search_1 in line:
print("------------------------------------------------------")
print(" Hostname = " + line[10])
print(" " + line[11])
print(" AssetId = " + line[30])
print(" IP = " + line[7])
print(" MAC = " + line[6])
print(" Owner = " + line[15])
print(" Username = " +line[14])
print(" Tel = " + line[17])
print(" Last Seen = " + line[27])
print("------------------------------------------------------")
csvfile.close()
如果我搜索主机名或者将额外的0个字符添加到资产编号,我希望代码能够忽略fqdn。我想我可以用len(search_1) < 8
修复资产编号问题,将0
附加到前面,直到它长达8个字符,但这样可以避免我真的更愿意只是搜索字符串而不需要操作它匹配我正在寻找的东西。
答案 0 :(得分:1)
不测试输入字符串是否在行中,而是测试输入字符串是否在任何列中。 any()
function非常适合:
if any(search_1 in col for col in line):
要稍微解决这个问题:csv.reader()
iterable中的每一行本身都是一个列列表,您可以循环使用这些列。 for col in line
就是这么做的。我们使用search_1
测试每列中是否存在search_1 in col
,any()
将执行循环,直到找到search_1 in col
为True
的列,其中它停止迭代循环并返回True
本身。如果未找到匹配项,则会返回False
。