在os.walk()期间找到绝对路径的更好方法?

时间:2015-05-25 18:28:34

标签: python python-2.7 file-io python-os

我正在练习os模块,更具体地说os.walk()。我想知道是否有更简单/更有效的方法来查找文件的实际路径,考虑到这会产生一条路径,表明文件在首次运行os.walk()时位于原始文件夹中:

import os

threshold_size = 500

for folder, subfolders, files in os.walk(os.getcwd()):
    for file in files:
        filePath = os.path.abspath(file)
        if os.path.getsize(filePath) >= threshold_size:
            print filePath, str(os.path.getsize(filePath))+"kB"

这是我目前的解决方法:

import os

threshold_size = 500

for folder, subfolders, files in os.walk(os.getcwd()):
    path = os.path.abspath(folder)
    for file in files:
        filePath = path + "\\" + file
        if os.path.getsize(filePath) >= threshold_size:
            print filePath, str(os.path.getsize(filePath))+"kB"

对于shaktimaan,这个:

for folder, subfolders, files in os.walk(os.getcwd()):
    for file in files:
        filePath = os.path.abspath(file)
        print filePath

产生这个(大多数这些文件都在项目的子文件夹中,而不是项目本身):

C:\Python27\projects\ps4.py
C:\Python27\projects\ps4_encryption_sol.py
C:\Python27\projects\ps4_recursion_sol.py
C:\Python27\projects\words.txt
C:\Python27\projects\feedparser.py
C:\Python27\projects\feedparser.pyc
C:\Python27\projects\news_gui.py
C:\Python27\projects\news_gui.pyc
C:\Python27\projects\project_util.py
C:\Python27\projects\project_util.pyc
C:\Python27\projects\ps5.py
C:\Python27\projects\ps5.pyc
C:\Python27\projects\ps5_test.py
C:\Python27\projects\test.py
C:\Python27\projects\triggers.txt
C:\Python27\projects\ps6.py
C:\Python27\projects\ps6_pkgtest.py
C:\Python27\projects\ps6_solution.py
C:\Python27\projects\ps6_visualize.py
C:\Python27\projects\ps6_visualize.pyc
C:\Python27\projects\capitalsquiz1.txt
C:\Python27\projects\capitalsquiz2.txt
C:\Python27\projects\capitalsquiz3.txt
C:\Python27\projects\capitalsquiz4.txt
C:\Python27\projects\capitalsquiz5.txt
C:\Python27\projects\capitalsquiz_answers1.txt
C:\Python27\projects\capitalsquiz_answers2.txt
C:\Python27\projects\capitalsquiz_answers3.txt
C:\Python27\projects\capitalsquiz_answers4.txt
C:\Python27\projects\capitalsquiz_answers5.txt
C:\Python27\projects\quiz.py
C:\Python27\projects\file2.txt
C:\Python27\projects\regexes.txt
C:\Python27\projects\regexsearch.py
C:\Python27\projects\testfile.txt
C:\Python27\projects\renamedates.py

3 个答案:

答案 0 :(得分:5)

我认为你误解了abspath的作用。 abspath只是将相对路径转换为完整的绝对文件名。

例如

os.path.abspath(os.path.join(r"c:\users\anonymous\", ".."))
#produces this output : c:\users

没有任何其他信息,abspath只能形成一个绝对路径,从它可以知道的唯一目录,对于您的情况,当前工作目录。所以目前它正在做的是加入os.getcwd()和你的file

所以你需要做的是:

for folder, subfolders, files in os.walk(os.getcwd()):
    for file in files:
        filePath = os.path.join(os.path.abspath(folder), file)

答案 1 :(得分:2)

你的工作应该可以正常工作,但更简单的方法是:

import os

threshold_size = 500

root = os.getcwd()
root = os.path.abspath(root) # redunant with os.getcwd(), maybe needed otherwise
for folder, subfolders, files in os.walk(root):
    for file in files:
        filePath = os.path.join(folder, file)
        if os.path.getsize(filePath) >= threshold_size:
            print filePath, str(os.path.getsize(filePath))+"kB"

这里的基本思想是,如果folder的参数为1,os.walk将是绝对规范化路径,如果任何参数是os.path.join,则os.path.abspath(file)将产生绝对规范化路径绝对路径和所有以下参数都已归一化。

{1}}在第一个示例中不起作用的原因是file是一个像quiz.py这样的裸名称。因此,当您使用abspath时,它与os.path.join(os.getcwd(), file)基本相同。

答案 2 :(得分:1)

这个简单的例子应该可以解决问题。 我已将结果存储在列表中,因为对我来说,将列表传递给不同的函数并在列表上执行不同的操作非常方便。

import os
directory = os.getcwd()
list1 = []

for root, subfolders, files in os.walk(directory):
  list1.append( [ os.path.join(os.path.abspath(root), elem) for elem in files if elem ])
# clean the list from empty elements
final_list = [ x for x in list1 if x != [] ]