将文件格式化为价格,产品名称和数量的清单

时间:2018-06-19 16:14:02

标签: python string

需要最简单,最简单的方法来完成以下工作

我有一个像这样的文件,其中包含带有价格的产品名称。

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)时,我正在尝试拆分其工作,但是如果包含更多单词,它将不再起作用,因为我正在用空格拆分。

6 个答案:

答案 0 :(得分: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)

您在这里有一个live example

答案 1 :(得分: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']]

答案 2 :(得分:0)

您已经准确地描述了逻辑问题:您需要用一个短语收集所有单词,而不是在空格上分开。注意输入行的共同特征:您有单词,后跟两个整数。一种方法是拆分,然后重新组合除最后两个元素以外的所有元素。另一种方法是使用rsplit方法(最多2个字段)进行拆分。第二个可能更好。

您还可以使用正则表达式(regex)处理此问题,但这将需要学习另一种功能,可能比您现在想要的更多。

答案 3 :(得分: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']]

答案 4 :(得分: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]]

答案 5 :(得分:0)

您可以使用re.splitre.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]]