我用 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
在 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)