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.