使用os.walk迭代文件,但无法打开和打印文本文件

时间:2014-08-13 23:28:27

标签: python os.walk

目前我正在尝试编写一个函数,将遍历所请求的目录并打印所有文件的所有文本。

现在,该函数可以将file_names显示为列表,因此文件肯定存在(文件中有文本)。

def PopularWordWalk (starting_dir, word_dict):
    print ("In", os.path.abspath(starting_dir))
    os.chdir(os.path.abspath(starting_dir))
    for (this_dir,dir_names,file_names) in os.walk(starting_dir):
        for file_name in file_names:
            fpath = os.path.join(os.path.abspath(starting_dir), file_name)
            fileobj = open(fpath, 'r')
            text = fileobj.read()
            print(text)

这是我的输出,其中包含一些目录内容的检查:

>>> PopularWordWalk ('text_dir', word_dict)

In /Users/normanwei/Documents/Python for Programmers/Homework 4/text_dir

>>> os.listdir()
['.DS_Store', 'cats.txt', 'zen_story.txt']

问题在于每当我尝试打印文本时,我什么也得不到。最终我想通过其他一些功能推送文本,但截至目前,似乎没有任何文字。任何人都可以借助任何文字出现的经验吗? (当试图打开文件/读取/存储以及在空闲状态下手动打印文本时,如果我只是手动输入' cats.txt'而不是' file_name') - 当前运行的python 3

编辑 - 问题已得到解答 - 只需删除os.chdir行 - 请参阅jojo的答案进行解释。

4 个答案:

答案 0 :(得分:4)

此行不起作用

file = open(file_name, 'r')

因为要求这些文件存在于运行脚本的同一文件夹中。您必须提供这些文件的路径以及文件名

with open(os.path.join(starting_dir,file_name), 'r') as file:
    #do stuff

这样它将构建目录和文件名的完整路径。

答案 1 :(得分:2)

您需要使用文件路径加入根路径。我改变了:

file = open(file_name, 'r')

fpath = os.path.join(this_dir, file_name)
file = open(fpath, 'r')

您可能还想使用另一个词来描述它而不是file,因为它是Python中的built-in function。我建议fileobj

答案 2 :(得分:2)

如果您执行os.chdir(os.path.abspath(starting_dir))会进入starting_dir 。然后for (this_dir,dir_names,file_names) in os.walk(starting_dir):将循环,因为 starting_dir不在starting_dir

长话短说,请评论os.chdir(os.path.abspath(starting_dir))行,你应该做得很好。

或者,如果你想坚持os.chdir,这应该可以胜任:

def PopularWordWalk (starting_dir, word_dict):
    print ("In", os.path.abspath(starting_dir))
    os.chdir(os.path.abspath(starting_dir))
    for (this_dir,dir_names,file_names) in os.walk('.'):
        for file_name in file_names:
            fpath = os.path.join(os.path.abspath(starting_dir), file_name)
            with open(fpath, 'r') as fileobj:
                text = fileobj.read()
            print(text)

答案 3 :(得分:1)

要添加到上一个答案,您必须加入绝对路径和步行的相对路径。

试试这个:

fpath = os.path.abspath(os.path.join(this_dir, file_name))
f = open(fpath, 'r')