在python

时间:2015-08-30 19:02:05

标签: python iteration

我正在清点大型图书馆中的所有文件。我们的想法是在列中写入路径,在其他列中写入文件的父目录,以及在其他列中写入文件。

我需要它在每个文件的相应单元格中写入父目录,这意味着写入该文件夹的名称的次数与其中的文件一样多。

这是我到目前为止所做的:

import os
import openpyxl

def crearlista (*arg, **kw):
    inventario = openpyxl.Workbook(encoding = "Utf-8")
    sheet = inventario.active
    i = 1
    e = ""
    for dirpath, subdirs, files in os.walk("//media//rayeus/Datos/Mis Documentos/Nueva carpeta/", topdown=False):

        for name in subdirs:
            e = os.path.join (name)


        for name in files:
            sheet.cell(row=i, column=3).value = name
            sheet.cell(row=i, column=1).value = dirpath
            sheet.cell(row=i, column=2).value = e
        i = i + 1 

这几乎完美无缺:它遍历文件夹中的每个文件,并将其名称和dirpath写入所需的位置。问题是它开始迭代第一个文件夹中的文件而不填充 e 变量。 因此,对于第二列中的前3行,我得到3个空白单元格,然后按顺序用文件夹的名称填充以下单元格(每个名称重复的次数与下一个文件的次数相同。文件夹而不是对应文件夹中的文件数量)

基本上我的问题是它在用相应的文件夹名称填充e变量之前迭代第一个文件夹中的文件。

换句话说,文件名和目录路径的写入比编写父目录更进一步,因此它完全混淆了第二列。

输出文件示例:

Nueva carpeta/-assorted-/The.Galactic.Black.Hole.Lectures.on (3587) "          "    cover.jpg
Nueva carpeta/-assorted-/The.Galactic.Black.Hole.Lectures.on (3587) "          "    metadata.opf
Nueva carpeta/-assorted-/The.Galactic.Black.Hole.Lectures.on (3587) "          "    The.Galactic.Black.Hole.Lecture - -assorted-.pdf
Nueva carpeta/100 Recetas De Cocina Espanola/http___www.recetas.net_admin_libros (5831) The.Galactic.Black.Hole.Lectures.on (3587)  cover.jpg
Nueva carpeta/100 Recetas De Cocina Espanola/http___www.recetas.net_admin_libros (5831) The.Galactic.Black.Hole.Lectures.on (3587)  http___www.recetas.net_admin_li - 100 Recetas De Cocina Espanola.pdf
Nueva carpeta/100 Recetas De Cocina Espanola/http___www.recetas.net_admin_libros (5831) The.Galactic.Black.Hole.Lectures.on (3587)  metadata.opf

1 个答案:

答案 0 :(得分:0)

如果文件是' a / b / c / x.txt',dirpath是' a / b / c'和' x.txt'应该在filesbasename(dirpath)将返回' 如果dirpath以' a / b / c /'结尾的斜杠结尾,则basename(dirpath)将返回'',一个空字符串。在这种情况下,basename(dirname('a/b/c/'))将返回' c。

from os.path import basename, dirname
import openpyxl

def crearlista (*arg, **kw):
    inventario = openpyxl.Workbook(encoding = "Utf-8")
    sheet = inventario.active
    i = 1

    for dirpath, subdirs, files in os.walk("//media//rayeus/Datos/Mis Documentos/Nueva carpeta/", topdown=False):    
        file_dir = basename(dirpath) or dirname(basename(dirpath))
        for name in files:
            sheet.cell(row=i, column=1).value = dirpath
            sheet.cell(row=i, column=2).value = file_dir
            sheet.cell(row=i, column=3).value = name
            i += 1