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,是的,我终于理解了您对我原始问题的评论。我刚把它取下来,它就工作了!谢谢你解释背后的逻辑!嘿,乔乔,是的,我终于明白你对我最初问题的评论了。我刚把它取下来,它就工作了!谢谢你解释背后的逻辑!