Форматирование файла в список с ценой, названием продукта и количеством

1

Нужен самый простой и простой способ сделать следующую работу

У меня есть файл вроде этого, содержащий имя продукта с ценами.

blackberry 23 100 
Black shirt with hoody (small) 4 800
Pastel Paint (red) (oil) 2 600

как я могу отформатировать их в список, подобный этому

 lst=[['blackberry' ,23 ,100],['Black shirt with hoody (small)' ,4 ,800],['Pastel Paint (red) (oil)' ,2 ,600]]

Я пытаюсь разделить его работу, когда имя продукта содержит только одно слово, например, Blackberry, но если больше слов включает его, это больше не работает, поскольку я разделяю пространство.

Теги:
string

6 ответов

3
Лучший ответ

Используйте str.rsplit, он начинает разделять на правую часть строки столько элементов, сколько вы указываете во втором аргументе (первый - это элемент разделения), как показано ниже:

l = [
"blackberry 23 100",
"lack shirt with hoody (small) 4 800",
"Pastel Paint (red) (oil) 2 600"
]

outlist = [x.rsplit(" ", 2) for x in l]
print(outlist)

Здесь у вас живой пример

  • 0
    Но это вернет каждый элемент списка в виде строки, если вам нужно преобразовать числа в int или float, вам потребуется дополнительная обработка.
  • 0
    Спасибо, я решил мою проблему ... Очень ценится
0
with open('demo.txt') as f:  # demo.txt is your file
    lines = f.readlines()

datas = [line.strip().rsplit(' ', 2) for line in lines]
print(datas)

Выход

[['blackberry', '23', '100'], ['Black shirt with hoody (small)', '4', '800'], ['Pastel Paint (red) (oil)', '2', '600']]
0

Вы можете использовать re.split и re.findall:

import re
data = [re.split('(?<=[a-zA-Z\W])\s(?=\d)', i.strip('\n')) for i in open('filename.txt')] 
final_data = [[a, *map(int, re.findall('\d+', b))] for a, b in data]

Выход:

[['blackberry', 23, 100], ['Black shirt with hoody (small)', 4, 800], ['Pastel Paint (red) (oil)', 2, 600]]
0

Здесь один из способов использования списка и str.rsplit. Мы используем str.isdigit для выбора элементов для целочисленного преобразования:

from io import StringIO

mystr = StringIO("""blackberry 23 100
Black shirt with hoody (small) 4 800
Pastel Paint (red) (oil) 2 600""")

res = []

# replace mystr with open('file.txt', 'r')
with mystr as fin:
    for line in fin:
        res.append([i if not i.isdigit() else int(i) \
                    for i in line.strip().rsplit(' ', 2)])

[['blackberry', 23, 100],
 ['Black shirt with hoody (small)', 4, 800],
 ['Pastel Paint (red) (oil)', 2, 600]]
0

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

    lst = []
    with open('test.txt', 'r') as file:
        content = file.readlines()
        for c in content:
            new = c.split()

            price = new[len(new)-1]
            quantity = new[len(new)-2]
            name = ' '.join(x for x in new[:len(new)-2])

            nlst = [name, quantity, price]
            lst.append(nlst)

Выход:

[['blackberry phone', '2', '500']]
0

Вы точно описали логическую проблему: вам нужно собрать все слова в одной фразе, а не разбивать на пробелы. Обратите внимание на общую характеристику входных строк: у вас есть слова, за которыми следуют два целых числа. Один из способов - раскол, но затем рекомбинация всех, кроме последних двух элементов. Другим является использование метода rsplit с ограничением двух полей для разделения. Второй, вероятно, лучше.

Вы также можете справиться с этим с регулярным выражением (regex), но для этого потребуется изучение другого объекта, скорее всего, больше, чем вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню