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

Python 使用os.walk迭代文件,但无法打开和打印文本文件,python,os.walk,Python,Os.walk,目前我正在尝试编写一个函数,它将遍历请求的目录并打印所有文件的所有文本 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): f

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

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的答案以获取解释。

这行行不通

file = open(file_name, 'r')
因为这需要这些文件存在于运行脚本的同一文件夹中。您必须提供这些文件的路径以及文件名

with open(os.path.join(starting_dir,file_name), 'r') as file:
    #do stuff
这样,它将根据目录和文件名构建完整路径。

这行行不通

file = open(file_name, 'r')
因为这需要这些文件存在于运行脚本的同一文件夹中。您必须提供这些文件的路径以及文件名

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

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

您需要将根路径与文件路径连接起来。我会改变:

file = open(file_name, 'r')


您可能还想使用另一个词来描述它,而不是
file
,因为这在Python中是一个很好的例子。我建议
fileobj

您需要将根路径与文件路径连接起来。我会改变:

file = open(file_name, 'r')


您可能还想使用另一个词来描述它,而不是
file
,因为这在Python中是一个很好的例子。我推荐
fileobj

只是为了补充上一个答案,您必须加入行走的绝对路径和相对路径

试试这个:

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

为了补充上一个答案,您必须将行走的绝对路径和相对路径连接起来

试试这个:

fpath = os.path.abspath(os.path.join(this_dir, file_name))
f = open(fpath, 'r')
如果您执行了
os.chdir(os.path.abspath(starting_dir))
则进入starting_dir。然后在os.walk(starting_dir)中为(this_dir、dir_names、file_names)执行
将不进行任何循环,因为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)
如果您执行了
os.chdir(os.path.abspath(starting_dir))
则进入starting_dir
。然后在os.walk(starting_dir)中为(this_dir、dir_names、file_names)执行
将不进行任何循环,因为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)

我试过你的方法,但似乎还是没用。实际上,作为一种测试方法,我尝试使用:file=open(os.path.join(os.path.abspath(starting_dir),file_name),'r'),但产生了相同的问题
starting_dir的路径是什么?如果连接
启动\u dir+文件\u name
是否会创建这些文件的完整路径?是的,路径组件看起来像什么?您可能还希望对路径上的
os.path.exists()
和/或
os.path.isfile()
执行健全性检查。是否
os.chdir
说明了起始路径?尝试了对os.path.exists()和os.path.isfile()进行检查,并且两者都产生true…这与.DS\u存储文件有关吗?是的,chdir确实进入了确切的目录,所以应该没有太多的需要,但我感到困惑,并用尽了所有可能我尝试了你的方法,但它似乎仍然没有做任何事情。实际上,作为一种测试方法,我尝试使用:file=open(os.path.join(os.path.abspath(starting_dir),file_name),'r'),但产生了相同的问题
starting_dir的路径是什么?如果连接
启动\u dir+文件\u name
是否会创建这些文件的完整路径?是的,路径组件看起来像什么?您可能还希望对路径上的
os.path.exists()
和/或
os.path.isfile()
执行健全性检查。是否
os.chdir
说明了起始路径?尝试了对os.path.exists()和os.path.isfile()进行检查,并且两者都产生true…这与.DS\u存储文件有关吗?是的,chdir确实进入了确切的目录,所以应该没有太多的需要,但我感到困惑,并且用尽了所有可能的方法。您可能不想读取
.DS\u Store
,是吗?我只是手动从我正在测试的起始目录中删除了.DS\u Store,但仍然没有任何内容=/您可能不想读取
.DS\u Store
,是吗?我只是手动从我正在测试的起始目录中删除了.DS\u Store,但仍然没有任何内容=/嘿,jojo,是的,我终于理解了您对我原始问题的评论。我刚把它取下来,它就工作了!谢谢你解释背后的逻辑!嘿,乔乔,是的,我终于明白你对我最初问题的评论了。我刚把它取下来,它就工作了!谢谢你解释背后的逻辑!