目前我正在尝试编写一个函数,将遍历所请求的目录并打印所有文件的所有文本。
现在,该函数可以将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的答案进行解释。
答案 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')