![](/img/trans.png)
[英]How can I take multiple file as input in python & store in a variable
[英]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
argparse
似乎是Python的標准部分 argparse
可以做很多事情,但是需要在許多行上進行相當復雜的調用 plac
是不錯的選擇,在大多數情況下可以快速進行服務 docopt
在所需的代碼行中最靈活,同時最短 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.