2014-07-15 60 views
0

我想在给定目录中的.txt文件上运行脚本。该文件夹中的文件将发生变化,我有兴趣列出它们并通过键盘输入选择一个文件。从Python中的键盘打开文件

这是我到目前为止的代码,

import os  
    folder = os.getcwd() #Current directory 
    files = [f for f in os.listdir(folder) if f.endswith('.txt')] 
    print 'Files available:\n %r' % files 

这将使我,我可以分析文件的列表的输出。

STH这样,

文件可用的:['file.txt的', 'foo.txt的', '的Test.txt']

而现在的代码段我卡在其中:

while True: 
     print "Introduce the name of the file" 
     choice = raw_input() 
     if choice.lower() == 'FILE FROM THE LIST':#Here's where I'm stuck 
      with open('FILE FROM THE LIST', 'rt') as inputfile: 
      data = csv.reader(inputfile) 
      #Do stuff 
     elif choice.lower() == 'e': 
      break 
     else: 
      print "Please, choose a valid option or type 'e' to exit" 

我应该怎么做才能输入文件名并从那里运行脚本?
理想情况下,我想在列出的文件和一个密钥或数字之间创建一个链接,使其更短,例如

[输入 '1' 来打开FILE.TXT,
类型 '2' 以打开foo.txt的,
类型 '3' 打开 'TEXT.TXT',...]

但是输入名字对我来说是一个很好的方式。

回答

1

这里有一个简单的解决问题的方法:

import glob 

files = glob.glob("*.txt") 
files.sort() 
print "select file:" 
for index, filename in enumerate(files): 
    print index, filename 

print "enter number of file to work on:", 
number = int(raw_input()) 

print "working on file: ", files[number] 

请注意,我如何使用“水珠”模块匹配TXT文件,而不是循环和匹配的简单手段。我没有为通过int()函数自动转换为整数的用户输入错误处理。最后,数字现在从零开始。如果你希望他们从一开始,你可以在显示时加1,并从用户输入中减1。

+0

这对于我想要的是完美的。非常感谢你。 –

1

看来您在寻找in关键字。然后,你可以检查类似

if choice in files: 
    #Do whatever you want with that filename 

或者,你可能会考虑首先生成一个字典,从文件名输入键。例如:

my_key_dict={} 
for count,entry in enumerate(files): 
    my_key_dict[count]=entry 

然后检查您的输入:

if choice in my_key_dict: 
    filename=my_key_dict[choice] 

当然,你也会希望以产生由my_key_dict以某种方式在用户的上市。

+0

感谢您的回答,问题在于为每个文件分配一个密钥似乎是一个不错的选择,以防列表中没有太多内容。以防万一我最终与数百人合作 - 这是可能的 - 我更喜欢用他们的解决方案中提出的方法来生成它们。 –

+0

我不认为一般的界面思想可以很好地适应数百个文件。在这种情况下,我宁愿让我的用户通过命令行提供要处理的文件列表。或者如果你正在使用GUI,可以通过文件选择小部件。但我同意在这之前,弗洛姆的解决方案要好得多。 – Christoph