使用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):
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 个回答
补充一下之前的回答,你需要把绝对路径和相对路径结合起来,才能完成这个操作。
试试这个:
fpath = os.path.abspath(os.path.join(this_dir, file_name))
f = open(fpath, 'r')
你需要把根路径和文件路径连接起来。我会把:
file = open(file_name, 'r')
改成
fpath = os.path.join(this_dir, file_name)
file = open(fpath, 'r')
另外,你可能想用一个不同的词来描述它,因为file
在Python中是一个内置函数。我建议用fileobj
。
这一行代码是不能运行的
file = open(file_name, 'r')
因为它需要这些文件和你运行脚本的文件夹在同一个地方。你需要提供这些文件的路径和文件名
with open(os.path.join(starting_dir,file_name), 'r') as file:
#do stuff
这样的话,它就能根据文件夹和文件名组合出完整的路径。
如果你执行了 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)