Mam plik tekstowy zawierający wiele 3-liniowych bloków tekstu, po których następuje pojedyncza nowa linia. Moje dane wyglądają tak:

title A - description
http://www.a.site.com/
http://a.anothersite.com/

title B - blah blah
http://www.site.b.com/
http://b.anothersite.com/

title C - yeah yeah
http://www.site.c.com/
http://anothersite.c.com/

Wynik, który mam nadzieję osiągnąć, wygląda mniej więcej tak:

title A - description | http://www.a.site.com/ | http://a.anothersite.com/   
title B - blah blah | http://www.site.b.com/ | http://b.anothersite.com/
title C - yeah yeah | http://www.site.c.com/ | http://anothersite.c.com/

Próbowałem to zrobić w Pythonie i tak naprawdę do niczego nie dochodzę. Najlepsze, co udało mi się osiągnąć, to usunięcie wszystkich nowych wierszy, ale to nie pomaga w tym przypadku, ponieważ nadal potrzebuję nowego wiersza między każdym fragmentem danych. Jakieś sugestie?

1
I0_ol 2 kwiecień 2020, 07:57

4 odpowiedzi

Najlepsza odpowiedź

Spróbuj tego:

import re
with open("file.txt", "r+") as f:
    text = " | ".join(f.readlines())
    text = re.sub(r"(?<!^)\n", '', text)
    text = re.sub(r"\s*\|\s*\|\s*", "\n", text)

    f.seek(0)
    f.write(text)

Wynik file.txt:

title A - description | http://www.a.site.com/ | http://a.anothersite.com/
title B - blah blah | http://www.site.b.com/ | http://b.anothersite.com/
title C - yeah yeah | http://www.site.c.com/ | http://anothersite.c.com/
1
Shubham Sharma 2 kwiecień 2020, 05:44
three_lines_joined = ''
strings_to_join = []
results = []


for index, item in enumerate(text):
    if item is not '\n':
        strings_to_join.append(item.strip())
    else:
        three_lines_joined = ' | '.join(strings_to_join)
        results.append(three_lines_joined)
        three_lines_joined = ''
        strings_to_join = []
1
Alexander Lekontsev 2 kwiecień 2020, 05:23

Oto moje rozwiązanie wykorzystujące wyrażenia regularne i zamień

import re

text = """
title A - description
http://www.a.site.com/
http://a.anothersite.com/

title B - blah blah
http://www.site.b.com/
http://b.anothersite.com/

title C - yeah yeah
http://www.site.c.com/
http://anothersite.c.com/
"""

text = text.strip()
text = re.sub('[^\n](\n)[^\n]', ' | ', text).replace('\n\n', '\n')

print(text)
1
Anton Pomieshchenko 2 kwiecień 2020, 05:28

Najpierw usuń puste linie, tak jak zrobiłeś, a następnie użyj lines = fulltext.split("\n"), aby uzyskać listę linii. Następnie uruchom coś takiego:

for i in range(len(lines))/3:
    title, desc = lines[3*a].split("-")
    website1, website2 = lines[3*a+1], lines[3*a+2]
    print(title + " - " + desc + " | " + website1 + " - " + website2)

Co pozwala na użycie zmiennych w kodzie. Jeśli naprawdę potrzebujesz tylko wyniku tekstowego, spójrz na swoje dane wejściowe, spróbuj:

fulltext.replace("\n"," ")

Który powinien wygenerować pożądany tekst (może z niewielką modyfikacją). Jednak bardziej polecałbym pierwszą wersję, ponieważ pozwoliłaby ci później na przykład użyć tych wartości do czegoś innego. Zmienne są generalnie bardziej przydatne niż dokumenty tekstowe sformatowane.

0
Theo 2 kwiecień 2020, 05:10