我正在尝试将一些旧的python代码转换为Go lang。但是我在整理文件夹中的文件时陷入困境。由于文件始终为id
,AMA1.txt
等。在python源代码中,我这样做:
AMA2.txt
我到现在为止,但是缺少排序:
files=[]
for file in os.listdir(someDir):
if file.endswith(".txt"):
files.append(file)
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)',key) ]
files.sort( key=alphanum_key )
for i in files:
print (i)
答案 0 :(得分:0)
将每一项收集到一个切片中,然后use the sort
package对它们进行排序。软件包docs中有示例和解释。
根据您的情况,在排序之前提取数字可能会更容易。为此,you might find fmt.Sscanf
有用。
答案 1 :(得分:0)
Go有一个sort
package。从带有非负整数后缀的名称构造一个可排序的名称。
例如,
package main
import (
"encoding/binary"
"fmt"
"os"
"path/filepath"
"sort"
"strconv"
)
// sortName returns a filename sort key with
// non-negative integer suffixes in numeric order.
// For example, amt, amt0, amt2, amt10, amt099, amt100, ...
func sortName(filename string) string {
ext := filepath.Ext(filename)
name := filename[:len(filename)-len(ext)]
// split numeric suffix
i := len(name) - 1
for ; i >= 0; i-- {
if '0' > name[i] || name[i] > '9' {
break
}
}
i++
// string numeric suffix to uint64 bytes
// empty string is zero, so integers are plus one
b64 := make([]byte, 64/8)
s64 := name[i:]
if len(s64) > 0 {
u64, err := strconv.ParseUint(s64, 10, 64)
if err == nil {
binary.BigEndian.PutUint64(b64, u64+1)
}
}
// prefix + numeric-suffix + ext
return name[:i] + string(b64) + ext
}
func main() {
dirname := "someDir"
d, err := os.Open(dirname)
if err != nil {
fmt.Println(err)
return
}
defer d.Close()
fi, err := d.Readdir(-1)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("\nUnsorted:")
for _, fi := range fi {
if fi.Mode().IsRegular() {
fmt.Println(fi.Name())
}
}
sort.Slice(
fi,
func(i, j int) bool {
return sortName(fi[i].Name()) < sortName(fi[j].Name())
},
)
fmt.Println("\nSorted:")
for _, fi := range fi {
if fi.Mode().IsRegular() {
fmt.Println(fi.Name())
}
}
}
输出:
Unsorted:
amt099.txt
amt.txt
amt2.txt
amt100.txt
amt10.txt
amt1.txt
Sorted:
amt.txt
amt1.txt
amt2.txt
amt10.txt
amt099.txt
amt100.txt