Прочитать файл и удалить \n и разбить список

У меня есть задание, в котором я должен прочитать файл "words.csv":

Hemuli,Muumipappa,13,4
Abbath,Fenriz,6,6

И я должен распечатать его следующим образом:

Hemuli 13 - 4 Muumipappa
Abbath 6 - 6 Fenriz

Мой код до сих пор:

def nayta_tulokset(words):
    with open(words) as tulos:
        tulokset = tulos.read()
        a = tulokset.split(",")
        print(a)

Это дает мне следующее list:

['Hemuli', 'Muumipappa', '13', '4\nAbbath', 'Fenriz', '6', '6']

Что именно то, что я хочу, но как мне продолжить, чтобы сократить это \ n? "4" и "Abbath" должны быть в одном из своих собственных индексов. Кажется, не могу понять... После этого я мог использовать индексы и распечатывать с format().

4 ответа

Решение

Ты можешь использовать splitlines() во время чтения

def nayta_tulokset(words):
    with open(words) as tulos:
        return tulos.read().splitlines()

# output: ['Hemuli,Muumipappa,13,4', 'Abbath,Fenriz,6,6']

Затем разбить строку .split(',')

for i in nayta_tulokset(words):
    _f = i.split(",")
    print("{} {} - {} {}".format(_f[0], _f[-2], _f[-1], _f[1]))

# Hemuli 13 - 4 Muumipappa
# Abbath 6 - 6 Fenriz

Решение, которое использует понимание списка и формат строки, как указано выше, может быть:

def nayta_tulokset(words):
    with open(words, 'r') as f:
        return list(map(lambda x:"{} {} - {} {}".format(x[0],x[2],x[3],x[1]), map(lambda x:x.split(','),f.read().split())))

так

nayta_tulokset('words.csv')
['Hemuli 13 - 4 Muumipappa', 'Abbath 6 - 6 Fenriz']

Чтобы получить желаемый результат, вам нужно прочитать каждую строку отдельно и распечатать ее как положено.

Создание, на вашем коде, вот как вы можете продолжить

def nayta_tulokset(words):
    with open(words) as tulos:
        for line in tulos.read().split('\n'):
           a = line.split(",")
           print("{} {} - {} {}".format(a[0], a[2], a[3], a[1]))

Вместо того, чтобы использовать tulos.read().split('\n'), ты можешь использовать tulos.readlines(), который позаботится о чтении вашего файла в список строк. Поэтому после рефакторинга код будет выглядеть так:

def nayta_tulokset(words):
    with open(words) as tulos:
        for line in tulos.readlines():
           a = line.split(",")
           print("{} {} - {} {}".format(a[0], a[2], a[3], a[1]))

Более подробная информация: я думаю, единственная неоднозначная часть кода заключается в следующем:

"{} {} - {} {}".format(a[0], a[2], a[3], a[1])

Что эквивалентно следующей конкатенации строк:

 a[0] +" " + a[2] +" - " + a[3] + " " +a[1]

Возможно, вы захотите использовать регулярные выражения. Вот так:

import re

def nayta_tulokset(words):
    with open(words) as tulos:
        tulokset = tulos.read()
        #a = re.findall(r"[\w']+", tulokset)
        a = re.split(",\n", tulokset)

Это должно дать вам:

['Hemuli', 'Muumipappa', '13', '4', 'Abbath', 'Fenriz', '6', '6']
Другие вопросы по тегам