
私は、ファイル名を受け取り、Linux コマンドライン内でファイルを開いてファイルのコンテンツを読み取ろうとするコマンドライン引数を記述しようとしています。引数が渡されない場合は、コード内で事前に定義されているファイルを開くだけです。現在、python file.py /home/Desktop/TestFile を実行すると、
エラーが発生しています: 認識されない引数:
def openfile():
first = sys.argv
for arg in sys.argv:
FILENAME = first
if len(arg) != 1:
with open(filename) as f:
else:
with open(FILENAME) as f:
答え1
あなたのコードは私に少し頭を悩ませさせました。
私がそれをどのように行うかは次のとおりです:
#!/usr/bin/env python3
import sys
def myOpen(aList):
fileName = "myFile"
if len(aList) > 1:
fileName = aList[1]
try:
with open(fileName) as f:
for line in f:
print(line, end="")
except IOError:
print("Can't open file " + fileName + ".")
myOpen(sys.argv)
さて、このスクリプトを実行すると、引数を渡さずに関数内のfileName
( ) を使用すると、次の結果が得られます。myFile
./args.py
foo
bar
baz
ファイルをもう一度確認してみましょうmyFile
。
cat myFile
foo
bar
baz
偽のファイルを指定すると、次のような結果になります。
./args.py foo
Can't open file foo.
最後に、引数として正しいファイルを指定すると、次のようになります。
./args.py vmstat.txt
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 2419392 76200 642712 0 0 25 10 20 62 0 0 99 1 0
コードの主な問題は次のとおりです:
FILENAME = first
変数first
には であるリスト全体が含まれているためsys.argv
、 の引数としてリスト要素を持つファイルを開くことはできません(open)
。次の点を確認してください。
#!/usr/bin/env python3
import sys
first = sys.argv
FILENAME = first
with open(FILENAME) as f:
for line in f:
print(f)
実行すると、次のようになります:
./faultyArgs.py myFile
Traceback (most recent call last):
File "./faultyArgs.py", line 8, in <module>
with open(FILENAME) as f:
TypeError: invalid file: ['./faultyArgs.py', 'myFile']
また、変数 を設定したことがないようですfilename
。
答え2
#!/usr/bin/env python
import sys
def openfile(fn):
file = open(fn, "r")
out = file.read()
print out
file.close()
openfile(sys.argv[1])
試してみてください。少なくともファイルを端末に読み出すには機能します。