簡體   English   中英

Python2.7-將參數傳遞給命令行以根據參數過濾CSV

[英]Python2.7 - Passing argument to command line to filter CSV according to parameter

我還沒有代碼,因為我不確定該如何解決。 使用tfidfVectorizersci-kitpython ,我計算了tfidf分數在電影評論使用的術語。

我將結果輸出到包含4列的CSV文件中

Col1 = indDocID 
Col2 = Word 
Col3 = MovieID 
Col4 = Score

我想傳遞一個命令行參數,該參數將解析CSV文件並僅打印與MovieID對應的結果。

這樣,直接從命令行,我就可以將我感興趣的結果稱為文件$python tfidf.py -i uniqMovieID

我一直在閱讀有關傳遞命令行參數的所有文獻,並一直在嘗試我的代碼,但是它們似乎沒有解決我過濾包含與我直接指示的相同MovieID的信息的問題。在命令行中。

CSV文件中的數據示例是

indDocID,Word,MovieID,Score
1,love,4583B,.09
2,good,4583B,.37
3,funny,4583B,.64
4,love,34623C,.34
5,hate,34623C,.57

我的目標是使用以下命令python tfidf.py -i 4583B運行腳本,以便結果是:

indDocID,Word,MovieID,Score
1,love,4583B,.09
2,good,4583B,.37
3,funny,4583B,.64

我一直在看這里 ,並嘗試了某些示例,例如

from optparse import OptionParser

parser = OptionParser()
parser.add_option("-i", "--idMovie", dest="arg",
                  help="insertMovieIds", metavar="variable")

以及這個:

def main(argv):
   movieIds = ''

   try:
      opts, args = getopt.getopt(argv,"hi:",["movieid="])
   except getopt.GetoptError:
      print 'test.py -i <movieID>'
      sys.exit(1)
   for opt, arg in opts:
      if opt == '-h':
         print 'tfidf.py -i <movieIds>'
         sys.exit()
      elif opt in ("-i", "--id"):
         movieIds = arg

   print 'MovieID is:', movieIds



if __name__ == "__main__":
   main(sys.argv[1:])

但是我不確定如何將它們成功集成到我的代碼中,以便將其與CSV的特定行相關聯以達到上述期望的結果。

使用csv.DictReader提取與傳入腳本的唯一MovieID匹配的任何行:

import csv
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-i", "--idMovie", dest="arg",
                  help="insertMovieIds", metavar="variable")
opt, args = parser.parse_args()
un_id = opt.arg
with open("out.txt") as f:
    names = next(f).rstrip().split(",")
    r = csv.DictReader(f, fieldnames=names)
    print(",".join(names))
    for d in r:
        if un_id == d["MovieID"]:
            print(",".join([d[n] for n in names]))

輸出:

$ python test.py -i 4583B 
indDocID,Word,MovieID,Score
1,love,4583B,.09
2,good,4583B,.37
3,funny,4583B,.64

您需要重新添加錯誤檢查等。如果您想對不同的cols重用代碼,只需將邏輯函數放入函數中,您也可能只想在發現匹配項並且沒有找到匹配項時打印標題給用戶的:

def find_by_val(col, k, fle, delim=","):
    with open(fle) as f:
        names = next(f).rstrip().split(delim)
        if col not in names:
            print("Column does not exist.")
            return
        r, found = csv.DictReader(f, fieldnames=names), False
        for d in r:
            if un_id == d[col]:
                if not found:
                    print(",".join(names))
                    print(",".join([d[n] for n in names]))
                    found = True
                else:
                    print(",".join([d[n] for n in names]))
        if not found:
            print("No matching value for {} found".format(k))

輸出:

padraic@lab:~$ python test.py -i 4583B 
indDocID,Word,MovieID,Score
1,love,4583B,.09
2,good,4583B,.37
3,funny,4583B,.64
padraic@lab:~$ python test.py -i foo
No matching value for foo found

如果將輸出存儲在列表中,則可以更簡潔地編寫它:

def find_by_val(col, k, fle, delim=","):
    with open(fle) as f:
        names = next(f).rstrip().split(delim)
        if col not in names:
            print("Column does not exist.")
            return
        r, found = csv.DictReader(f, fieldnames=names), False
        output = [",".join(d[n] for n in names) for d in r if d[col] == k ]
        if not output:
            print("No matching value for {} found".format(k))
        else:
            print(",".join(names))
            print("\n".join(output))

如果您想使用更通用的方法,您可能還應該將列名作為參數,並采用多個值來查找。

如果您僅需要使用附加參數-i將行與MoveID進行匹配,則-i可能是不必要的(如果您需要指定用於匹配的列,則附加參數會很有用)。 您可以使用python tfidf.py 4583B測試以下代碼

#!/usr/bin/env python

import sys, csv

def search(db, mid):
    # open csv file
    with open(db, 'r') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        for r in reader:
            # print line if MovieID matches
            if r[2] == mid:
                print(','.join(r))

if __name__ == '__main__':
    # parse arguments    
    db, mid = sys.argv[1:]
    search(db, mid)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM