简体   繁体   中英

Sorting text file in python3

I have a text file bk.txt that looks like this:

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' 

I'm trying to sort the file line by line in alphabetical order and save the results to a new file, ive tried a couple different sorting methods such as this below:

        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)

But whenever I run the code I'm getting an error talking about invalid literal for int(0 with base 10 in 'file'

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'

I know this is a slightly uncommon text file to order, but is there something wrong in my sorting code that is causing the file to not be read / sorted into a new file correclty?

Thanks

EDIT EDIT EDIT

Working on fix proposed by Patrick, current python code is:

 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())

I'm trying to implement the duel-sort needed to get my optimal sorted output, but am currently looking at an outputed sort of:

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'     ```

One line of your file is

file 'name number.aif'

You try to sort by spliting it and taking the first part:

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

Fix:

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())

Output:

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'

To keep inside the "sections" you need a 2-part sorting:

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

to get

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'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM