我有一个父文件夹,其中包含多个文件夹。然后,这些嵌套文件夹中的每一个都包含4个文件,这些文件构成了一个地理信息系统shapefile,并且具有不同的扩展名(即".dbf“、".prj”、".shp“和”shx“)。我是编程新手(在R之外),不知道这是否可以使用Python自动完成,或者是否需要运行shell脚本(我正在windows上工作)。我有非常初级的编码学校,所以文档将是很好的(和/或建议“虚拟”网站阅读)。
以下是当前文件结构的示例(显示了我要用子文件夹名称重命名的四个文件):
Parent Folder: "Raptors"
Subfolder: "Falco_peregrinus"
File 1: "ra03310.dbf"
File 2: "ra03310.prj"
File 3: "ra03310.shp"
File 4: "ra03310.shx"以下是我希望将这四个文件重命名为的名称:
File 1: Falco_peregrinus.dbf
File 2: Falco_peregrinus.prj
File 3: Falco_peregrinus.shp
File 4: Falco_peregrinus.shx谢谢。
发布于 2015-02-17 03:49:19
您可以使用几乎任何编程语言(可能包括R)来完成此任务。Python在这里是一个很好的选择,因为它具有如此友好的语法。
一个非常简单的解决问题的脚本可能如下所示
import os
import os.path
'''
Given a file name, returns a pair with the name and extension (hello.txt => [hello,txt])
'''
def split_name(file_name):
return file_name.rsplit('.',1)
'''
Recursively renames files in subdirectories of base_directory so each file is named the subdirectory name plus the extension
WARNING! You will be very sad if you have multiple files with the same extension in any of those folders
def rename_file(base_directory):
#Get the folder name for base_directory (c:\users\foobar => foobar)
directory_name = os.basename(base_directory)
#List the files in base_directory
for path in os.listdir(base_directory):
old_name = base_directory + '/' + path
#If the path points to a file, rename it directory name + '.' + extension
if os.path.isfile(old_name):
new_name = base_directory + '/' + directory_name + '.' + split_name(path)[1]
if not os.path.exists(new_name):
os.rename(old_name,new_name)
else:
print("ERROR:"+new_name+" exists")
else:
#If it's a subfolder, recursively call rename files on that directory.
rename_files(old_name)此外,我强烈建议Zed Shaw以艰难的方式学习Python,并深入了解Mark Pilgrim的Python
发布于 2015-02-17 03:53:45
对于批处理文件解决方案
@echo off
for /d %%a in ("c:\...\Raptors\*") do ren "%%~fa\*.*" "%%~na.*"对于父文件夹中的每个文件夹,将该文件夹中的所有文件重命名为该文件夹的名称,但保留扩展名
for命令用于迭代父文件夹下的文件夹列表(/d)。对于每个文件夹,可替换参数%%a将保存对子文件夹的引用,并为每个文件夹执行do子句中的代码。
do子句中的代码对子文件夹(%%~fa是使用完整路径处理的文件夹)下的所有文件执行ren命令,并将其名称更改为文件夹的名称(%%~na)。
编辑的答案并不完全正确。虽然只使用一个ren命令重命名每个文件夹下的所有文件的基本思想可能是最快的方法,但如果文件夹名称包含点,the way ren command handles wildcards会使此代码失败。为了确保代码不会失败,有必要遍历文件,重命名每个文件
for /d %%a in ("c:\...\Raptors\*") do for %%b in ("%%~fa\*") do ren "%%~fb" "%%~nxa%%~xb"对于每个文件夹(%%a),对于文件夹(%%b)中的每个文件,将文件重命名为带有文件扩展名(%%~xb)的完整文件夹名称(%%~nxa)
发布于 2015-02-17 04:01:20
一个简单的windows命令就能解决你的问题。阅读HELP FOR并在Windows命令行中尝试以下命令:
for /d %a in (*) do @for %b in (%a\*) do @ren %a\%b %a%~xb让我们来分析一下
第一个for将迭代所有目录/d,对于每个找到的目录,传入%a,第二个for将迭代它包含的所有文件(%a\*),对于每个找到的文件,它将使用<代码>d12中包含的文件夹的名称do ren ren<代码>d11,并保留其具有的<代码>d13的扩展名。
https://stackoverflow.com/questions/28548929
复制相似问题