-1

ネットワーク上の一部のコンピューターに関する情報を含む 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資産番号の問題は、長さが 8 文字になるまで先頭に追加することで解決できると思いますが、0探しているものと一致するように文字列を操作せずに文字列を検索することを本当に好むという事実を回避しています。 .

4

1 に答える 1

1

入力文字列が行にあるかどうかをテストする代わりに、入力文字列がいずれかの列にあるかどうかをテストします。このany()関数は、次の場合に最適です。

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 colTrueTrueFalse

于 2013-03-11T11:06:53.817 に答える