我正在清点大型图书馆中的所有文件。我们的想法是在列中写入路径,在其他列中写入文件的父目录,以及在其他列中写入文件。
我需要它在每个文件的相应单元格中写入父目录,这意味着写入该文件夹的名称的次数与其中的文件一样多。
这是我到目前为止所做的:
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
答案 0 :(得分:0)
如果文件是' a / b / c / x.txt',dirpath
是' a / b / c'和' x.txt'应该在files
。 basename(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