2015-02-05 33 views
0

我想在这里用下面的脚本做一些事情(它是不完整的)。首先是循环访问一些子目录。我能够成功地做到这一点。第二件事是打开一个特定的文件(它在每个子目录中都是相同的名称),并在每列中找到最小值和最大值,除了第一个。Python - 文件不存在错误

现在我被困在单列中查找最大值,因为我正在阅读的文件有两行,我想忽略。不幸的是,试图运行代码时,我发现了以下错误:

Traceback (most recent call last): 
    File "test_script.py", line 22, in <module> 
    with open(file) as f: 
IOError: [Errno 2] No such file or directory: 'tc.out' 

这里是我的代码的当前状态:

import scipy as sp 
import os 

rootdir = 'mydir'; #mydir has been changed from the actual directory path 
data = [] 

for root, dirs, files in os.walk(rootdir): 
    for file in files: 
     if file == "tc.out": 
      with open(file) as f: 
       for line in itertools.islice(f,3,None): 
        for line in file: 
        fields = line.split() 
        rowdata = map(float, fields) 
        data.extend(rowdata) 
        print 'Maximum: ', max(data) 
+0

嗨,欢迎来到Stack Overflow。你所描述的错误与帖子的标题无关,这对于进来回答的人来说是令人困惑的。您应该询问您遇到的问题,而不是更大的背景......除非您修复文件问题并且仍然存在问题,否则我们不需要了解该问题。 – 2015-02-05 14:52:35

+0

对不起!最初的问题已经修复。我想我们现在正面临更大的问题。如果我将它保持原样,可以吗? – 2015-02-05 14:57:15

+0

不是,你应该提出一个新问题。否则,所有人都会一直在提出新的问题,这就打破了Stackoverflow的“一个问题”机制的目的。 – 2015-02-05 15:07:48

回答

1

当你写open(file),Python是试图找到在目录中的文件tc.out你来自哪里开始解释。您应该使用完整路径文件中打开:

with open(os.path.join(root, file)) as f: 

让我用一个例子:

我有一个目录/tmp/sto/deep/(这是一个Unix系统命名为“somefile.txt”文件,所以我使用正斜杠)。然后,我有这个简单的脚本驻留在目录/tmp

[email protected]:/tmp$ cat myscript.py 
import os 

rootdir = '/tmp' 
for root, dirs, files in os.walk(rootdir): 
    for fname in files: 
     if fname == 'somefile.txt': 
      with open(os.path.join(root, fname)) as f: 
       print('Filename: %s' % fname) 
       print('directory: %s' % root) 
       print(f.read()) 

当我从/tmp目录执行这个脚本,你会看到fname只是文件名,导致它的路径被省略。这就是为什么你需要加入第一个从os.walk返回的参数。

[email protected]:/tmp$ python myscript.py 
Filename: somefile.txt 
directory: /tmp/sto/deep 
contents 
+0

这工作!感谢奥利弗和塞尔丘克。 – 2015-02-05 14:57:43

1

要打开你需要指定完整路径的文件。您需要将线

with open(file) as f: 

改变

with open(os.path.join(root, file)) as f: