Python搜索CSV文件并返回相关信息
我有一个csv文件,其中包含我们网络上一些计算机的信息。我希望能够从命令行键入一个快速行,以便从csv返回相关项目。格式如下:Python搜索CSV文件并返回相关信息,python,regex,csv,python-3.x,Python,Regex,Csv,Python 3.x,我有一个csv文件,其中包含我们网络上一些计算机的信息。我希望能够从命令行键入一个快速行,以便从csv返回相关项目。格式如下: $ tag.py *hostname* csv大约有50列,包含从MAC地址到网络上最后一次看到的信息。我只想在搜索时输出这些列的选择。我已经编写了必要的代码,它可以正常工作。不过,我希望搜索更加灵活。目前,搜索词必须与我搜索的值完全相同。阿卡 $ tag.py mycomputer # This returns nothing $ tag.py myc
$ 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()
#导入模块
导入系统
导入csv
#获取用户输入
#我假设脚本是以script.py“搜索词”的形式使用的
#如果命令中未添加任何输入,请请求用户输入
如果len(系统argv)<2:
打印(“请输入主机名或资产号”)
搜索_1=输入(“搜索:”)
其他:
search_1=sys.argv[1]
#设置变量
#打开cvs并设置csv.reader设置
csvfile=open(“file.csv”,“r”,encoding=“拉丁语-1”)
csvfile.seek
reader=csv.reader(csvfile,dialogue='excel',delimiter=“,”,quotechar=“”)
#在cvs中搜索输入字符串
对于行内读取器:
如果搜索第1行:
打印(“--------------------------------------------------------------”)
打印(“主机名=”+行[10])
打印(“+行[11])
打印(“AssetId=”+行[30])
打印(“IP=”+行[7])
打印(“MAC=”+行[6])
打印(“所有者=”+行[15])
打印(“用户名=”+行[14])
打印(“电话=”+行[17])
打印(“上次看到的=”+行[27])
打印(“--------------------------------------------------------------”)
csvfile.close()
如果我搜索主机名或向资产编号添加额外的0个字符,我希望代码能够忽略fqdn。我想我可以用
len(search_1)解决资产编号问题<8
在前面添加一些0
,直到它有8个字符长,但这避免了一个事实,即我真的更喜欢只搜索字符串,而不操纵它以匹配我要查找的内容。与其测试输入字符串是否在行中,不如测试输入字符串是否在任何列中。最理想的情况是:
if any(search_1 in col for col in line):
要稍微分解一下:您的
csv.reader()
iterable中的每一行本身就是一个列列表,您可以循环这些列对于第行中的列
就是这样做的。我们测试search\u 1
是否存在于列中,列中有search\u 1
,并且any()
将执行循环,直到找到列中search\u 1在列中为True
,在这种情况下,它停止循环并返回True
本身。如果未找到匹配项,则返回False
。非常感谢。这正是我所需要的。它现在工作得很好:)