Как создать список строк, используя специальный символ, чтобы понять, где разделить - PullRequest
0 голосов
/ 04 мая 2019

У меня есть текстовый файл, который состоит из песен со всех альбомов Pink Floyd, который выглядит так:

#The Piper At The Gates Of Dawn::1967
*Lucifer Sam::Syd Barrett::03:07::Lucifer Sam, Siam cat
Always sitting by your side
Always by your side
... ( The lyrics of the song )
*Matilda mother::Syd Barrett::03:07::There was a king who ruled the land
His majesty was in command
With silver eyes the scarlet eagle
... ( The lyrics of the song )
#Another album
*another song
song's lyrics

Я хотел бы создать из него список строк, используя альбомы (обозначенные символом #) как одну строку, и все песни в нем как другую строку после этого и так далее, например:

["album\n", "*song's name\nlyrics\n*song's name\nlyrics ..."]

Спасибо большое! : D

Редактировать: поэтому я заметил, что мое объяснение немного неуклюже, поэтому я перефразирую его.

То, что я хочу сделать, - это преобразовать данный текст в список, в котором каждый альбом и его данные разделены в переменных, поэтому у меня будет что-то вроде этого:

["album's name, "(Everything between the album's name and the next one)", "album's name", ...] 

и так далее.

Перед альбомами стоит #, и мне нужно как-то использовать его, чтобы отделить от его песен.

Я пытался создать a, для которого находит каждый # и первый \ n после этого для создания списка, но он превратился в пепел: (

Внимание! Ясное объяснение: предположим, у вас есть строка, которая выглядит так:

#Hello
Whatever
#Hello
More Whatever

Я хочу отделить каждого Привет от всего, что угодно. так что у меня было бы что-то подобное:

["hello", "Whatever", "Hello", "Whatever]

Мне очень жаль мои плохие объяснения. это самый простой способ объяснить это вам: D

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Не супер эффективно, но работает:

f = "filepath"

txt = "".join([line + "#" if line.startswith("#") else line for line in open(f)])
data = [x for x in txt.split("#")][1:]
data

['The Piper At The Gates Of Dawn::1967\n',
 '*Lucifer Sam::Syd Barrett::03:07::Lucifer Sam, Siam cat\nAlways sitting by your side\nAlways by your side\n... ( The lyrics of the song )\n*Matilda mother::Syd Barrett::03:07::There was a king who ruled the land\nHis majesty was in command\nWith silver eyes the scarlet eagle\n... ( The lyrics of the song )\n',
 'Another album\n',
 "*another song\nsong's lyrics\n"]
0 голосов
/ 04 мая 2019

Вы можете сделать это с помощью регулярных выражений (модуль re), рассмотрите следующий пример, допустим, что у вас есть файл songs.txt следующим образом:

#Song 1
First line
Second line
#Song 2
First line of second
Last line

Вы можете сделать:

import re
with open('songs.txt','r') as f:
    data = f.read()
songs = re.findall(r'(#.+?\n)([^#]+)',data)
#now songs is list of 2-tuples with song name and "song body"
songs = list(sum(songs,())) #here I am doing so called flattening
print(songs) #['#Song 1\n', 'First line\nSecond line\n', '#Song 2\n', 'First line of second\nLast line\n']

pattern (1-й аргумент re.findall) содержит две группы, обозначенные скобками (()), первая - для заголовка, а вторая - для текста. Первая группа должна быть в форме: #, за которой следует 1 или более не новых строк (\n) и заканчивающихся символом новой строки (\n). Вторая группа означает просто 1 или более символов, которые не являются #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...