0

我想自动使用 . 保存电子表格时使用的文件名xlwtData假设在 python 程序正在运行的文件夹中有一个名为的子目录。我希望程序计算该文件夹中的文件数(# = n)。然后文件名必须以 (n+1) 结尾。如果文件夹中有 0 个文件,则文件名必须为Trial_1.xls. 该文件必须保存在该子目录中。

我知道以下内容:

import xlwt, os, os.path
n = len([name for name in os.listdir('.') if os.path.isfile(name)])

计算同一文件夹中的文件数。

a = n + 1
filename = "Trial_" + "a" + ".xls"
book.save(filename)

这会将正确命名的文件保存到同一文件夹中。

我的问题是如何将其扩展到子目录?谢谢。

4

3 回答 3

3

os.listdir('.').in this 指向执行文件的目录。将 to 更改为.您感兴趣的子目录。

你应该从你的文件系统的根目录给它完整的路径名;否则它将相对于执行脚本的目录。这可能不是您想要的;特别是如果您需要从另一个程序引用子目录。

您还需要提供filename变量的完整路径;这将包括子目录。

为了让生活更轻松,只需设置变量的完整路径并在需要时引用它。

TARGET_DIR = '/home/me/projects/data/'
n = sum(1 for f in os.listdir(TARGET_DIR) if os.path.isfile(os.path.join(TARGET_DIR, f)))
new_name = "{}Trial_{}.xls".format(TARGET_DIR,n+1)
于 2012-11-18T06:47:55.720 回答
3

你实际上想要glob

from glob import glob    

DIR = 'some/where/'
existing_files = glob(DIR + '*.xls')
filename = DIR + 'stuff--%d--stuff.xls' % (len(existing_files) + 1)
于 2012-11-18T12:11:04.203 回答
0

既然您说 Burhan Khalid 的回答“完美运行!” 你应该接受它。

我只是想指出另一种计算数字的方法。你这样做的方式是可行的,但如果我们想象你在数沙粒或其他东西会占用太多内存。这是获取计数的更直接方法:

n = sum(1 for name in os.listdir('.') if os.path.isfile(name))

对于每个符合条件的名称,我们都会得到一个 1,所有这些 1 都会被输入sum(),然后你就会得到你的计数。

请注意,此代码使用“生成器表达式”而不是列表推导。上面的代码没有构建一个列表,获取它的长度,然后丢弃该列表,而是创建了一个迭代器来sum()迭代计算计数。

这有点低俗,但我们可以使用一个快捷方式:sum()接受布尔值,并将True其视为 1 和False0。我们可以将它们相加。

# sum will treat Boolean True as a 1, False as a 0
n = sum(os.path.isfile(name) for name in os.listdir('.'))

这非常棘手,我可能不会在不发表评论的情况下使用它。但我相信这是在 Python 中计算事物最快、最有效的方法。

于 2012-11-18T07:26:45.970 回答