Сортировка текстового файла в python3 - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть текстовый файл 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 (0 с основанием 10 в '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'

Я знаю, что это немного необычный текстовый файл на заказ, но есть ли что-то неправильное в моем коде сортировки, из-за которого файл не читается / не сортируется в новый файл?

Спасибо

РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЕ

Работа над исправлением, предложенным Патриком, текущий 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'     ```

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Одна строка вашего файла:

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'
0 голосов
/ 25 апреля 2020

Просто замените строку:

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

на:

sorted_rows = sorted(rows)

...