如何在Golang中重命名不同目录中的一组文件

Kei*_*ley 2 go python-2.7

我用 Python 2.7 编写了一个程序,通过替换文件名中的数字来重命名目录中的文件。我尝试用 Golang 应用程序做同样的事情,但它不起作用。控制台仍然给出新名称,但不会更改文件目录中照片的名称。

这是Python程序

import os
def rename_files():
    #(1) get files names from a folder
    file_list = os.listdir(r"C:\\Users\\g\\Desktop\\Fun\\udacity\\foundationsofpython\\07finalrenamingapp\\prank")
    print(file_list)
    saved_path = os.getcwd()
    print (saved_path)
    os.chdir(r"C:\\Users\\g\\Desktop\\Fun\\udacity\\foundationsofpython\\07finalrenamingapp\\prank")

    #2 rename all files names in folder
    for file_name in file_list:
        print ("Old Name - " +file_name)
        print ("New Name - " +file_name.strip("0123456789"))
        os.rename(file_name,file_name.strip("0123456789"))
    os.chdir(saved_path)

rename_files()
Run Code Online (Sandbox Code Playgroud)

这很好用。然而,这个Golang脚本并没有 这是Golang程序

package main

import (
    "log"
    "os"
    "fmt"
    "regexp"
)
func readCurrentDir() {
    dir := "C:\\Users\\g\\Desktop\\prank"
    file, err := os.Open(dir)
    if err != nil {
        log.Fatalf("failed opening directory: %s", err)
    }
    defer file.Close()

    list,_ := file.Readdirnames(0) // 0 to read all files and folders
    for _, name := range list {
        oldName := name
        fmt.Println("Old Name - ", oldName)
        re := regexp.MustCompile( "[^A-za-z]" )
        newName := re.ReplaceAllString( oldName, " ")
        fmt.Println("New Name - ", newName)        
        os.Rename(dir+oldName, dir+newName)
        fmt.Println("File names have been changed")

    }
}

func main() {
    readCurrentDir()

}
Run Code Online (Sandbox Code Playgroud)

如果您想将这些内容从 github 存储库拉到项目中,这里有一个链接,将为您提供代码和存储图像的照片文件夹。通过查看我的代码需要更改的地方,我将受益匪浅。如果您能提供任何帮助或建议,我们将不胜感激。非常感谢。

Python应用程序 https://github.com/lashleykeith/GoingwithGolang/tree/master/OldCode2BeChanged

Golang 应用程序 https://github.com/lashleykeith/GoingwithGolang/tree/master/our_tutorial/5finalrenamingapp

pet*_*rSO 6

在 Go 中,总是、总是检查错误。那么你的许多问题就会显而易见。例如,你有os.Rename错误。

使用filepath包来操作文件名路径。编译常量regex表达式只能进行一次。修复你的regexp错误:"[^A-za-z]"应该是"[^A-Za-z]"

这是一个工作版本:

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
    "regexp"
)

func readCurrentDir() {
    dir := "C:\\Users\\g\\Desktop\\prank"
    file, err := os.Open(dir)
    if err != nil {
        log.Fatalf("failed opening directory: %s", err)
    }
    defer file.Close()

    list, err := file.Readdirnames(0) // 0 to read all files and folders
    if err != nil {
        log.Fatalf("failed reading directory: %s", err)
    }
    re := regexp.MustCompile("[^A-Za-z]")
    for _, name := range list {
        oldName := name
        fmt.Println("Old Name - ", oldName)
        newName := re.ReplaceAllString(oldName, " ")
        fmt.Println("New Name - ", newName)
        err := os.Rename(filepath.Join(dir, oldName), filepath.Join(dir, newName))
        if err != nil {
            log.Printf("error renaming file: %s", err)
            continue
        }
        fmt.Println("File names have been changed")
    }
}

func main() {
    readCurrentDir()
}
Run Code Online (Sandbox Code Playgroud)

输出:

Old Name -  prankster.42.txt
New Name -  prankster    txt
File names have been changed
Run Code Online (Sandbox Code Playgroud)

差异:

> git diff old.go new.go
diff --git a/old.go b/new.go
index 464b60e..7ae276e 100644
--- a/old.go
+++ b/new.go
@@ -4,6 +4,7 @@ import (
        "fmt"
        "log"
        "os"
+       "path/filepath"
        "regexp"
 )

@@ -15,69 +16,31 @@ func readCurrentDir() {
        }
        defer file.Close()

-       list, _ := file.Readdirnames(0) // 0 to read all files and folders
+       list, err := file.Readdirnames(0) // 0 to read all files and folders
+       if err != nil {
+               log.Fatalf("failed reading directory: %s", err)
+       }
+       re := regexp.MustCompile("[^A-Za-z]")
        for _, name := range list {
                oldName := name
                fmt.Println("Old Name - ", oldName)
-               re := regexp.MustCompile("[^A-za-z]")
                newName := re.ReplaceAllString(oldName, " ")
                fmt.Println("New Name - ", newName)
-               os.Rename(dir+oldName, dir+newName)
+               err := os.Rename(filepath.Join(dir, oldName), filepath.Join(dir, newName))
+               if err != nil {
+                       log.Printf("error renaming file: %s", err)
+                       continue
+               }
                fmt.Println("File names have been changed")
-
        }
 }

 func main() {
        readCurrentDir()
-
 }
>
Run Code Online (Sandbox Code Playgroud)