2015-12-02 94 views
0

我有这样的代码,可以让用户通过在命令行中传递参数来选择要更新哪个文件,然后它会做更多的事情,但我没有在这里包括:使用python命令行参数

import sys 
import os 
from sys import argv 

path = "/home/Desktop/python/test" 
files = os.walk(path) 
filename = argv[1] 

if filename in files: 
    inputFile = open(filename, 'r') 
else: 
    print "no match found" 
    sys.exit() 
    inputFile.close() 

当我运行该脚本时,它一直给我“找不到匹配”,但我很确定该文件在那里。我不知道什么我做错了

+1

使用'os.listdir'而不是'os.walk'来获取'path'中的文件列表而不是生成器。 – Holt

+0

@Holt:但考虑到你仍然需要使用'os.path.join(path,filename)'来打开文件。 –

回答

3

os.walk()返回一个生成器,一个产生的元组值为(root, directories, files)每个迭代值。

您不能使用该生成器来测试单个文件,而不是使用简单的in成员资格测试。

您还需要重新设置整个路径;你不能只打开一个未分类的文件名而没有它所在的目录。只需在这里使用for循环,一旦你找到它,就使用break。该else套房上for仅环,当你没有执行使用break(例如文件未找到):

path = "/home/Desktop/python/test" 
filename = argv[1] 

for root, directories, files in os.walk(path): 
    if filename in files: 
     full_path = os.path.join(root, filename) 
     break 
else: 
    print "no match found" 
    sys.exit() 

with open(full_path) as input_file: 
    # do something with the file 

我加了with语句来处理文件对象的生命周期;一旦with块被退出,该文件将自动关闭。

+0

@霍尔特:谢谢;有点匆忙,我知道我应该检查。 –

1

或者,您可以使用以下代码片段。

import os.path 
filename = argv[1] 
path = "/home/Desktop/python/test/" 
if os.path.isfile(path + filename): 
    inputFile = open(path + filename, "r") 
else: 
    print "File Not Found" 
+0

这将检查当前目录中的'filename',而不是'path'。 – Holt

+0

@Holt我已更新我的代码。 – niyasc

+1

你真的应该使用'os.path.join()';例如,它会处理诸如在末尾添加缺少的路径分隔符等细节。 –