Python自动文件名
我想自动使用Python自动文件名,python,file-io,python-2.7,Python,File Io,Python 2.7,我想自动使用xlwt保存电子表格时使用的文件名。假设python程序正在运行的文件夹中有一个名为Data的子目录。我希望程序计算该文件夹中的文件数(#=n)。那么文件名必须以(n+1)结尾。如果文件夹中有0个文件,则文件名必须为Trial\u 1.xls。此文件必须保存在该子目录中 我知道: import xlwt, os, os.path n = len([name for name in os.listdir('.') if os.path.isfile(name)]) 统计同一文件夹中的
xlwt
保存电子表格时使用的文件名。假设python程序正在运行的文件夹中有一个名为Data
的子目录。我希望程序计算该文件夹中的文件数(#=n)。那么文件名必须以(n+1)结尾。如果文件夹中有0个文件,则文件名必须为Trial\u 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)
这会将中正确命名的文件保存到同一文件夹中
a = n + 1
filename = "Trial_" + "a" + ".xls"
book.save(filename)
我的问题是如何将其扩展到子目录?谢谢。os.listdir('.')
此处的
指向执行文件的目录。更改
以指向您感兴趣的子目录
您应该从文件系统的根目录中为它指定完整的路径名;否则,它将相对于执行脚本的目录。这可能不是你想要的;特别是当您需要从另一个程序中引用子目录时
您还需要提供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)
os.listdir('.')
此处的
指向执行文件的目录。更改
以指向您感兴趣的子目录
您应该从文件系统的根目录中为它指定完整的路径名;否则,它将相对于执行脚本的目录。这可能不是你想要的;特别是当您需要从另一个程序中引用子目录时
您还需要提供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)
既然你说Burhan Khalid的答案“非常有效”,你应该接受它 我只是想指出另一种计算数字的方法。你这样做是可行的,但如果我们想象你在数沙粒或其他东西,会占用太多的内存。以下是获取计数的更直接的方法:
n = sum(1 for name in os.listdir('.') if os.path.isfile(name))
对于每个符合条件的名称,我们得到一个1,所有这些1都被输入到sum()
中,然后你得到你的计数
请注意,此代码使用“生成器表达式”而不是列表。上面的代码不是构建一个列表,获取其长度,然后丢弃该列表,而是生成一个迭代器,sum()
迭代以计算计数
这有点低级,但我们可以使用一个快捷方式:sum()
将接受布尔值,并将True
视为1,将False
视为0。我们可以把这些加起来
# sum will treat Boolean True as a 1, False as a 0
n = sum(os.path.isfile(name) for name in os.listdir('.'))
这是非常棘手的,我可能不会使用它而不发表评论。但我相信这是用Python计算事物的最快、最有效的方法。既然你说Burhan Khalid的答案“非常有效”,你应该接受它 我只是想指出另一种计算数字的方法。你这样做是可行的,但如果我们想象你在数沙粒或其他东西,会占用太多的内存。以下是获取计数的更直接的方法:
n = sum(1 for name in os.listdir('.') if os.path.isfile(name))
对于每个符合条件的名称,我们得到一个1,所有这些1都被输入到sum()
中,然后你得到你的计数
请注意,此代码使用“生成器表达式”而不是列表。上面的代码不是构建一个列表,获取其长度,然后丢弃该列表,而是生成一个迭代器,sum()
迭代以计算计数
这有点低级,但我们可以使用一个快捷方式:sum()
将接受布尔值,并将True
视为1,将False
视为0。我们可以把这些加起来
# sum will treat Boolean True as a 1, False as a 0
n = sum(os.path.isfile(name) for name in os.listdir('.'))
这是非常棘手的,我可能不会使用它而不发表评论。但我相信这是Python中计算事物的最快、最有效的方法。您实际上想要:
你实际上想要:
os.listdir
未给出完整路径。只有基本名称。是的,修正了,在没有理解的情况下做得更好。非常好!我使用TARGET_DIR='data/',因为它在同一个文件夹中(我想我在最初的问题中不清楚)。谢谢另外,我注意到您使用.format()创建文件名的方式效率更高。你是怎么用的?以前从未见过。请参阅os上的文档。listdir
未给出完整路径。只有基本名称。是的,修正了,在没有理解的情况下做得更好。非常好!我使用TARGET_DIR='data/',因为它在同一个文件夹中(我想我在最初的问题中不清楚)。谢谢另外,我注意到您使用.format()创建文件名的方式效率更高。你是怎么用的?以前从未见过。请参阅有关感谢的文档。没有意识到有一个“接受”功能;我是这个网站的新手。完成:)@Jey你应该读这本书。谢谢。没有意识到有一个“接受”功能;我是这个网站的新手。完成:)@Jey您应该阅读。这比执行os.listdir
更合适,因为glob会立即从扩展模式解析您的文件。然而,我建议使用os.glob1(DIR,*.xls')
使结果列表更小(仅基名称),并使用os.path.join
加入DIR和新基名称。这比使用os.listdir
更合适,因为glob会立即从扩展模式解析文件。然而,我建议使用os.glob1(DIR,'.*.xls')
使结果列表更小(仅基名称),并使用os.path.join
加入t