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

1 投票
4 回答
1010 浏览
提问于 2025-04-18 17:14

我现在正在尝试写一个函数,这个函数会遍历指定的文件夹,并打印出所有文件里的文本。

目前,这个函数可以把文件名显示成一个列表,所以文件肯定是存在的(而且文件里也有文本)。

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']

问题是,每当我尝试打印文本时,什么也没有显示。最终我想把这些文本传递给其他函数,但现在没有文本显示,这似乎没什么意义。有没有人能分享一下,为什么没有文本出现呢?(当我在IDLE里手动打开文件、读取、存储和打印文本时是可以的,比如我直接输入'cats.txt'而不是'file_name')- 目前我在使用Python 3。

编辑 - 这个问题已经解决了 - 只需要去掉 os.chdir 这一行 - 具体解释请看jojo的回答。

4 个回答

1

补充一下之前的回答,你需要把绝对路径和相对路径结合起来,才能完成这个操作。

试试这个:

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

你需要把根路径和文件路径连接起来。我会把:

file = open(file_name, 'r')

改成

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

另外,你可能想用一个不同的词来描述它,因为file在Python中是一个内置函数。我建议用fileobj

4

这一行代码是不能运行的

file = open(file_name, 'r')

因为它需要这些文件和你运行脚本的文件夹在同一个地方。你需要提供这些文件的路径和文件名

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

这样的话,它就能根据文件夹和文件名组合出完整的路径。

2

如果你执行了 os.chdir(os.path.abspath(starting_dir)) 这行代码,你就会进入到 starting_dir 这个目录里。然后,当你用 for (this_dir,dir_names,file_names) in os.walk(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)

撰写回答