【问题标题】:Parsing text file and storing it in a list解析文本文件并将其存储在列表中
【发布时间】:2015-08-01 14:51:27
【问题描述】:

我有一个包含以下格式数据的文件 discount.txt:

Less than $100 --> 0%
From $100 up to less than $500 --> 10%
From $500 up to less than $1,000 --> $40 PLUS 20%
From $1,000 up to less than $2,000 --> $140 PLUS 30%
$2,000 and above --> $440 PLUS 40%

表示销售额的折扣

Less than $100  0%
From $100 up to less than $500  10% for each dollar over $100
From $500 up to less than $1,000    $40 PLUS 20% of the total sale amount over $500
From $1,000 up to less than $2,000  $140 PLUS 30% of the total sale amount over $1,000
$2,000 and above    $440 PLUS 40% of the total sale amount over $2,000

也就是说,如果总销售额为 100 美元,则折扣为 0 美元。但是,如果总销售额为 101 美元,则折扣为 0.10 美元。如果总销售额为 500 美元,则折扣为 40 美元,但如果总销售额为 501 美元,则折扣为 40.20 美元。

所以为了解决这个问题,我认为有4个列表:1个列表用于存储销售金额的下限,一个用于上限,一个用于保存与范围相对应的固定增量,一个用于保存额外折扣。如果没有固定增量,则假定为零。

然后对于给定的销售额,如果它在第 i 个范围内,那么只需执行以下操作:

fixedIncrement[i] + (saleAmount-lowerLimit[i])*additionDiscount[i]

但我面临的问题是解析给定的文本文件。有人可以帮助解析它并将其存储在 python 中的列表中

在给定的文件中,列表将是这样的:

lowerLimit[] = [1,100,500,1000,2000]
upperLimit[] = [100,500,1000,2000,MAX]
fixedIncrement[] = [0,0,40,140,440]
additionDiscount[] = [0,0.1,0.2,0.3,0.4]

【问题讨论】:

  • @Prera​​kSola 我解释了我的方法。我想知道除了我的想法之外是否还有更好的选择。我的代码有点乱。我已经提取了每一行并对其进行了解析。我希望有一些优雅的方式来做到这一点
  • 您解释了您的计算方法。但是您提到的问题是关于解析文本文件。那么到目前为止,您尝试过什么来解析该文本文件?那其中的错误/非必需行为是什么?
  • @python_slayer 方法很可能是相同的:你取一行,正则表达式的值并将它们存储在列表中。然后从初始列表中每个列表的 i++ 元素创建新的列表列表。
  • @konart 为什么要列出列表?打算怎么做?
  • @python_slayer 因为每一行都可以被视为 2-3 个值的列表,并且您有 N 行。换句话说,您正在构建一个矩阵 A,然后将其转置为 A'。 “如何”是什么意思?

标签: python


【解决方案1】:

打开 .txt:

with open ("data.txt", "r") as myfile:
    data=myfile.readlines()

每一行都应该是列表中的一个字符串,例如['字符串一',字符串二'] 将每个字符串转换为字符串列表

all_lines = [i.split() for i in data]
>>> all_lines = [['string', 'one'], ['string', 'two']]

for l in all_lines:
    # Go through each line 

从 100 美元到低于 500 美元 --> 10% 转化为:

l = ['From', '$100', 'up', 'to', 'less', 'than', '$500', '-->', '10%']

现在您应该能够使用逻辑对其进行解析。例如从这一行中获取范围参数:

all_ranges = []
r1 = [i for i in l if "$" in i]
if l[0] == 'From':  # Contains a range       
    r = (int(r1[0][1:]), int(r1[1][1:]))
    all_ranges.append(r)

print all_ranges

>>> [(100, 500)]

编辑:

elif l[0] == "Less":   # No range in this line
   r = (0, int(r1[0][1:]))  # Range is from 0 to $100
   all_ranges.append(r)
else:
    top = l[0][1:]
    all_ranges.append((top, 1000000))  # High range

>>>> [(100, 500), (0, 100), (2000, 1000000)]

【讨论】:

  • 不包含 'From' 的行呢?你能在整个文本文件的上下文中解释一下吗?就像第一行小于 100 美元,最好包括范围 (1,100)。同样对于最后一行达到最大限制
  • 最后一个疑问,如何将文本文件加载为 csv 字符串?
  • 使用类似 reader = csv.reader(csvfile, delimiter=' ') 的东西。见stackoverflow.com/questions/17262256/…
  • 对不起,你有一个 .txt 文件,刚刚意识到。见http://stackoverflow.com/questions/8369219/how-do-i-read-a-text-file-into-a-string-variable-in-python
  • 它是一个 txt 文件,而不是 csv 文件。它会这样工作吗?
【解决方案2】:

您可以采用这种方法:

  1. 为您的数据创建一个 CSV 文件。这将降低读取文件的复杂性。格式可能类似于:

lower_limit、upper_limit、fixed_increment、discount
1,100,0,0
100,500,0,0.1
500,1000,40,0.2

  1. 使用python的csv模块读取文件并将值存储在相应的列表中。您可以在此处查看有关它的文档:Python docs
  2. 根据您的公式计算金额。

【讨论】:

  • 我不想制作单独的文件。我可以修改我的数据结构,但不能修改其他文件。我必须使用正则表达式和所有来解析它
  • @python_slayer 所以你在课堂上做这个。
  • @Prera​​ksola 在课堂上?
  • @python_slayer 您不必将 csv 文件写入磁盘,只需在内存中使用即可。
猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2013-06-14
  • 2014-09-13
  • 2018-12-29
相关资源
最近更新 更多