簡體   English   中英

如何獲取可變數量的文件作為python腳本的輸入?

[英]How can I take a variable number of files as input for a python script?

例如,我希望能夠運行以下假設命令:

$ python script.py *.txt option1 option2

並在與* .txt匹配的每個文件上執行

目前,我僅發現一次操作一個文件的信息

from sys import argv

self, file, option1, option2 = argv

perform_operation(file, option1, option2)

#function definition

您要使用argparse-module:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("--option1")
parser.add_argument("--option2")
parser.add_argument("files", nargs="+")

opts = parser.parse_args()

print opts.option1
print opts.option2
print opts.files

像這樣使用:

 beer:~ deets$ python2.7 /tmp/argparse-test.py  text foo bar baz
 None
 None
 ['text', 'foo', 'bar', 'baz']

argv是一個列表。 假設您僅要傳遞文件名參數。 如果更復雜,則請按Deets的回答進行。

self = sys.argv[0]
arguments = sys.argv[1:]

現在, arguments是程序參數的列表。 假設我們要一次處理它們:

for argument in arguments:
    work(argument)

或者我們想將它們全部傳遞給一個函數:

work(arguments)

至於傳遞*.txt作為參數。 您的外殼程序(甚至在程序運行之前)將為您完成大部分工作。

如果我運行python program.py *.txt ,其中*.txt指向3個文本文件,那么我的shell將會擴展為使我的程序看到python program.py a.txt b.txt c.txt

multifile.py

"""
Usage:
    multifile.py <file>...
    multifile.py -h

Prints something about all the <file>... files.
"""

def main(files):
    for fname in files:
        print fname

if __name__ == "__main__":
    from docopt import docopt
    args = docopt(__doc__)
    files = args["<file>"]
    main(files)

用它

首先安裝docopt

$ pip install docopt

調用不帶參數的命令:

$ python multifile.py
Usage:
    multifile.py <file>...
    multifile.py -h

嘗試幫助

$ python multifile.py -h
Usage:
    multifile.py <file>...
    multifile.py -h

Prints something about all the <file>... files.

將其用於一個文件:

$ python multifile.py alfa.py 
alfa.py

使用通配符將它用於多個文件:

$ python multifile.py ../*.py

    ../camera2xml.py
    ../cgi.py
    ../classs.py

結論

  • docopt允許更多選項(請參閱docopt
  • 命令行解析在Python中很容易
    • 自2.7版以來, argparse似乎是Python的標准部分
    • argparse可以做很多事情,但是需要在許多行上進行相當復雜的調用
    • plac是不錯的選擇,在大多數情況下可以快速進行服務
    • 在我看來docopt在所需的代碼行中最靈活,同時最短

使用stdlib中的inputfile

stdlib中有一個通常被忽略的庫,稱為inputfile

默認情況下,它會將命令行或標准輸入中的所有輸入作為文件名處理,並且不僅允許遍歷這些文件,還允許遍歷其中的所有行,對其進行修改,解壓縮以及許多其他實際操作。

filenames.py列出所有文件名

import fileinput

for line in fileinput.input():
    print "File name is: ", fileinput.filename()
    fileinput.nextfile()

稱它為:

$ python filenames.py *.txt
File name is: films.txt
File name is: highscores.txt
File name is: Logging.txt
File name is: outtext.txt
File name is: text.txt

upperlines.py用大寫字母打印多個文件中的所有行

import fileinput

for line in fileinput.input():
    print line.upper(),

並稱之為:

$ python upperlines.py *.txt
THE SHAWSHANK REDEMPTION (1994)
THE GODFATHER (1972)
THE GODFATHER: PART II (1974)
THE DARK KNIGHT (2008)
PULP FICTION (1994)
JAN HAS SCORE OF 101
PIETER HAS SCORE OF 900
CYRIL HAS SCORE OF 2
2014 APR 11  07:14:03.155  SECTORBLAH
   INTERESTINGCONTENT
   INTERESTING1 = 843
1. LUV_DEV <- HE'S A DEVELOPER
2. AMIT_DEV <- HE'S A DEVELOPER
....

upperlinesinplace.py將文件中的所有行都轉換為大寫

import fileinput

for line in fileinput.input(inplace=True):
    print line.upper(),

結論

  • fileinput作為默認參數sys.argv[:1]並遍歷所有文件和行
  • 您可以傳遞自己的文件名列表進行處理
  • fileinput允許就地更改,過濾,讀取文件名,行號...
  • fileinput甚至允許處理壓縮文件

暫無
暫無

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

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