[英]Python2.7 - Passing argument to command line to filter CSV according to parameter
我還沒有代碼,因為我不確定該如何解決。 使用tfidfVectorizer
在sci-kit
的python
,我計算了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.