在python3中排序文本文件

问题描述 投票:-1回答:2

我有一个文本文件bk.txt,看起来像这样:

file 'wave bass 1.aif' 
file 'wave bass 10.aif' 
file 'wave bass 11.aif' 
file 'wave bass 12.aif' 
file 'wave bass 13.aif' 
file 'wave bass 14.aif' 
file 'wave bass 15.aif' 
file 'wave bass 16.aif' 
file 'wave bass 2.aif' 
file 'wave bass 3.aif' 
file 'wave bass 4.aif' 
file 'wave bass 5.aif' 
file 'wave bass 6.aif' 
file 'wave bass 7.aif' 
file 'wave bass 8.aif' 
file 'wave bass 9.aif' 
file 'wave effect 1.aif' 
file 'wave effect 2.aif' 
file 'wave effect 3.aif' 
file 'wave effect 4.aif' 
file 'wave effect 5.aif' 
file 'wave effect 6.aif' 
file 'wave effect 7.aif' 
file 'wave effect 8.aif' 
file 'wave hit 1.aif' 
file 'wave hit 10.aif' 

我正在尝试按字母顺序对文件逐行排序,并将结果保存到新文件中,我尝试了几种不同的排序方法,如下所示:

        fn = songsFilepath + "bk.txt"
        sorted_fn = songsFilepath + "bkSorted.txt"

        with open(fn,'r') as first_file:
            rows = first_file.readlines()
            sorted_rows = sorted(rows, key=lambda x: int(x.split()[0]), reverse=False)
            with open(sorted_fn,'w') as second_file:
                for row in sorted_rows:
                    second_file.write(row)

但是每当我运行代码时,我都会得到一个错误,该错误是关于int无效文字(在'file'中以10为底的0]

Traceback (most recent call last):
  File "commandLineMusicVideo/__init__.py", line 213, in <module>
    fullAlbum(songsFilepath, audioFormat, imageFilepath, outputResolution)
  File "commandLineMusicVideo/__init__.py", line 87, in fullAlbum
    sorted_rows = sorted(rows, key=lambda x: int(x.split()[0]), reverse=False)
  File "commandLineMusicVideo/__init__.py", line 87, in <lambda>
    sorted_rows = sorted(rows, key=lambda x: int(x.split()[0]), reverse=False)
ValueError: invalid literal for int() with base 10: 'file'

我知道这是要订购的稍微不常见的文本文件,但是我的排序代码中是否有什么错误导致该文件无法读取/正确分类为新文件?

谢谢

编辑编辑编辑

正在研究Patrick提出的修复程序,当前的python代码是:

        fn = songsFilepath + "bk.txt"
        sorted_fn = songsFilepath + "bkSorted.txt"

        with open(fn,'r') as first_file:
            rows = first_file.readlines()
        
        #sort 1
        sorted_rows = sorted(rows, key=lambda x: (x.strip().split()[:3],int(x.strip().split()[-1].split(".")[0])), reverse=False)

        #sort 2, change the sorting function to take the last split and split before the .
        sorted_rows = sorted(rows, key = lambda x: int(x.strip().split()[-1].split(".")[0]), reverse = False)

        #write results to file
        with open(sorted_fn,'w') as second_file:
            for row in sorted_rows:
                second_file.write(row)

        print('finished sorted = ')
        print(open(sorted_fn).read())

我正在尝试实现获得最佳排序输出所需的决斗排序,但目前正在查看以下输出的排序:

file 'wave bass 1.aif'     
file 'wave effect 1.aif'   
file 'wave hit 1.aif'      
file 'wave tone 1.aif'     
file 'wave bass 2.aif'     
file 'wave effect 2.aif'   
file 'wave tone 2.aif'     
file 'wave bass 3.aif'     
file 'wave effect 3.aif'   
file 'wave hit 3.aif'      
file 'wave tone 3.aif'     
file 'wave bass 4.aif'     
file 'wave effect 4.aif'   
file 'wave hit 4.aif'      
file 'wave tone 4.aif'     ```
python-3.x sorting text-files
2个回答
0
投票

文件的一行是

file 'name number.aif'

您尝试通过拆分并采用第一部分来进行排序:

int("file 'wave bass 10.aif'\n".split()[0])  => 'file' - not a number ->int() crashes

修复:

with open ("bk.txt","w") as f:f.write("""file 'wave bass 1.aif'
file 'wave bass 10.aif'\nfile 'wave bass 11.aif'\nfile 'wave bass 12.aif'
file 'wave bass 13.aif'\nfile 'wave bass 14.aif'\nfile 'wave bass 15.aif'
file 'wave bass 16.aif'\nfile 'wave bass 2.aif'\nfile 'wave bass 3.aif'
file 'wave bass 4.aif'\nfile 'wave bass 5.aif'\nfile 'wave bass 6.aif'
file 'wave bass 7.aif'\nfile 'wave bass 8.aif'\nfile 'wave bass 9.aif'
file 'wave effect 1.aif'\nfile 'wave effect 2.aif'\nfile 'wave effect 3.aif'
file 'wave effect 4.aif'\nfile 'wave effect 5.aif'\nfile 'wave effect 6.aif'
file 'wave effect 7.aif'\nfile 'wave effect 8.aif'\nfile 'wave hit 1.aif'
file 'wave hit 10.aif'
""")

fn = "bk.txt"
sorted_fn = "bkSorted.txt"

with open(fn,'r') as first_file:
    rows = first_file.readlines()

# change the sorting function to take the last split and split before the .
sorted_rows = sorted(rows, key = lambda x: int(x.strip().split()[-1].split(".")[0]), 
                     reverse = False)
with open(sorted_fn,'w') as second_file:
    for row in sorted_rows:
        second_file.write(row)

print(open(sorted_fn).read())

输出:

file 'wave bass 1.aif'
file 'wave effect 1.aif'
file 'wave hit 1.aif'
file 'wave bass 2.aif'
file 'wave effect 2.aif'
file 'wave bass 3.aif'
file 'wave effect 3.aif'
file 'wave bass 4.aif'
file 'wave effect 4.aif'
file 'wave bass 5.aif'
file 'wave effect 5.aif'
file 'wave bass 6.aif'
file 'wave effect 6.aif'
file 'wave bass 7.aif'
file 'wave effect 7.aif'
file 'wave bass 8.aif'
file 'wave effect 8.aif'
file 'wave bass 9.aif'
file 'wave bass 10.aif'
file 'wave hit 10.aif'
file 'wave bass 11.aif'
file 'wave bass 12.aif'
file 'wave bass 13.aif'
file 'wave bass 14.aif'
file 'wave bass 15.aif'
file 'wave bass 16.aif'

要保留在“部分”中,您需要分为两部分:

key=lambda x: (x.strip().split()[:3],   # sort by first textual parts
               int(x.strip().split()[-1].split(".")[0])), reverse=False) # then number

获取

file 'wave bass 1.aif'
file 'wave bass 2.aif'
file 'wave bass 3.aif'
file 'wave bass 4.aif'
file 'wave bass 5.aif'
file 'wave bass 6.aif'
file 'wave bass 7.aif'
file 'wave bass 8.aif'
file 'wave bass 9.aif'
file 'wave bass 10.aif'
file 'wave bass 11.aif'
file 'wave bass 12.aif'
file 'wave bass 13.aif'
file 'wave bass 14.aif'
file 'wave bass 15.aif'
file 'wave bass 16.aif'
file 'wave effect 1.aif'
file 'wave effect 2.aif'
file 'wave effect 3.aif'
file 'wave effect 4.aif'
file 'wave effect 5.aif'
file 'wave effect 6.aif'
file 'wave effect 7.aif'
file 'wave effect 8.aif'
file 'wave hit 1.aif'
file 'wave hit 10.aif'

-1
投票

只需替换行

sorted_rows = sorted(rows,key = lambda x:int(x.split()[0]),reverse = False)

作者

sorted_rows = sorted(rows)

© www.soinside.com 2019 - 2024. All rights reserved.