Нужен самый простой и простой способ сделать следующую работу
У меня есть файл вроде этого, содержащий имя продукта с ценами.
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, но если больше слов включает его, это больше не работает, поскольку я разделяю пространство.
Используйте 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)
Здесь у вас живой пример
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']]
Вы можете использовать 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]]
Здесь один из способов использования списка и 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]]
вы можете взять индекс из последнего. например, последний индекс вернет цену, второй - вернуть количество, а остальное - имя продукта. Затем, когда у вас есть все элементы, вы можете добавить их в список.
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']]
Вы точно описали логическую проблему: вам нужно собрать все слова в одной фразе, а не разбивать на пробелы. Обратите внимание на общую характеристику входных строк: у вас есть слова, за которыми следуют два целых числа. Один из способов - раскол, но затем рекомбинация всех, кроме последних двух элементов. Другим является использование метода rsplit
с ограничением двух полей для разделения. Второй, вероятно, лучше.
Вы также можете справиться с этим с регулярным выражением (regex), но для этого потребуется изучение другого объекта, скорее всего, больше, чем вы хотите.