Python os.walk从当前目录

时间:2017-03-28 08:51:05

标签: python os.walk

如何编辑此脚本,它将从当前目录运行。如果我现在运行脚本,我会收到错误,它无法找到我指定的文件。我的感觉是os.walk没有在当前目录的子文件夹中搜索。我不想指定路径名,因为我想在不同的目录中运行此脚本。 总结一下;请帮我改变这个脚本,它将从当前目录运行并找到当前目录的子文件夹中的文件。谢谢!

import os
import csv
from itertools import chain
from collections import defaultdict


for root, dirs, files in os.walk('.'):
    d1 = {}
    with open (os.path.join(root, 'genes.gff.genespercontig.csv'), 'r') as f1:
        for line in f1:
            ta = line.split()
            d1[ta[1]] = int(ta[0])

    d2 = {}
    with open(os.path.join(root, 'hmmer.analyze.txt.result.txt'), 'r') as f2:
        for line in f2:
            tb = line.split()
            d2[tb[1]] = int(tb[0])

    d3 = defaultdict(list)
    for k, v in chain(d1.items(), d2.items()):
        d3[k].append(v)

    with open(os.path.join(root, 'output_contigsvsgenes.csv'), 'w+') as fnew:
            writer = csv.writer(fnew)     
            for k,v in d3.items(): 
                writer.writerow([k] + v) 

4 个答案:

答案 0 :(得分:1)

import os
os.getcwd() #return the current working directory

所以在你的情况下,循环变为:

for root, dirs, files in os.walk(os.getcwd()): 

在您的情况下,您可能还需要检查文件是否存在:

if os.path.isfile(os.path.join(root, 'genes.gff.genespercontig.csv')):
    with open (os.path.join(root, 'genes.gff.genespercontig.csv'), 'r') as f1:
        for line in f1:
            ta = line.split()
            d1[ta[1]] = int(ta[0])

同样适用于所有其他语句

答案 1 :(得分:0)

您可以使用os.getcwd()获取当前目录(调用脚本时所在目录),但最好将目标目录作为参数传递。

答案 2 :(得分:0)

在Python脚本中,有许多选项允许深入反省,以便更好地定位运行脚本的环境。当前目录可通过

获得
  

os.getcwd()

您在评论中建议,要处理的文件不在当前目录中,而是在子目录中。在这种情况下,像这样调整你的脚本(将你的循环的整个块更深一层地移动到for dir in dirs:并相应地调整os.path.join()):

for root, dirs, files in os.walk(os.getcwd()):
    for dir in dirs: 
        print(os.path.join(root, dir, 'genes.gff.genespercontig.csv'))

只是为了它的乐趣,下面简要介绍一下Python脚本在其中运行的一些其他有用的环境见解:

import __future__    
import os, sys
print( "Executable running THIS script    : { " + sys.executable                                          + " }" )
print( "Full path file name of THIS script: { " + os.path.realpath(__file__)                              + " }" )
print( "Full path directory to THIS script: { " + os.path.dirname(os.path.abspath(__file__))              + " }" )
print( "Current working directory         : { " + os.getcwd()                                             + " }" )
print( "Has THIS file started Python?     : { " + { True: "Yes", False: "No" }[(__name__ == "__main__")]  + " }" )
print( "Which Python version is running?  : { " + sys.version.replace("\n", "")                           + " }" )
print( "Which operating system is there?  : { " + sys.platform                                            + " }" )

答案 3 :(得分:0)

我认为问题无法在当前目录中运行,我认为问题在于您使用os.walk的方式。您应该在开始使用它们之前检查文件是否存在,我认为可能会发生错误,因为第一个root文件夹是当前工作目录。我们可以将它重新排列成一个函数,如下所示:

import os
import csv
from itertools import chain
from collections import defaultdict


def get_file_values(find_files, output_name):
    for root, dirs, files in os.walk(os.getcwd()):
        if all(x in files for x in find_files):
            outputs = []
            for f in find_files:
                d = {}
                with open(os.path.join(root, f), 'r') as f1:
                    for line in f1:
                        ta = line.split()
                        d[ta[1]] = int(ta[0])
                outputs.append(d)

            d3 = defaultdict(list)
            for k, v in chain(*(d.items() for d in outputs)):
                d3[k].append(v)

            with open(os.path.join(root, output_name), 'w+') as fnew:
                writer = csv.writer(fnew)
                for k, v in d3.items():
                    writer.writerow([k] + v)

get_file_values(['genes.gff.genespercontig.csv', 'hmmer.analyze.txt.result.txt'], 'output_contigsvsgenes.csv')

没有您的数据我无法对此进行测试,但我认为它应该可行。

修改

要获取输出csv文件的每一行中包含的文件夹,我们可以稍微将我们的调用更改为writer.writerow

writer.writerow([root, k] + v)

因此,创建的每个csv文件的第一列都包含从中获取值的文件夹的名称。