【问题标题】:Incorrectly reading lines of a text File in python在 python 中错误地读取文本文件的行
【发布时间】:2019-11-20 14:38:33
【问题描述】:

所以基本上我想迭代具有这种格式的文本文件的行:

-----------------------------------------
Code: 0123456789
EGGS: 3 7.00 21.00
BACON: 1 3.50 3.50
COFFEE: 2 14.20 28.40
TOTAL: 52.90
----------------------------------------- 

我有以下代码来逐行阅读:

with open(filename, "rt", encoding="utf-8") as f:
   for line in f:
       prevline = line
       line.split()

       if '-' in line:
           temp = f.readline().split(':') #Get Code
           print(temp)
           AFM = temp[1]
           print(AFM)
       else:
           tempProducts = line.split(':') #Get Product in a list 
           productName = tempProducts[0] #Store Product Name in a variable
           productStats = tempProducts[1] #Store Product Stats in a list
           productStats = productStats.split(" ")
           for value in productStats:
               valueArray.append(float(value))
               products.update({productName:valueArray})
       if '-' in f.readline():
           rec = Receipt(AFM,products)
           products={}
           valueArray=[]
           receipts.append(rec)
       else:
           line=prevline

请注意,我想跳过带有 '------------' 字符的代码行,但它会继续读取第二行,然后是第四行,然后是第六行(代码、培根、总计)。问题是我该如何解决这个问题。编辑:文件中有多个收据,所以我每次都需要跳过带有'---------'的行。

【问题讨论】:

  • 预期的输出是什么,我不太清楚。 Receipt 是什么?
  • 预期的输出是我有一个(例如培根) valueArray=['1','3.50','3.50'] 和一个 products{Bacon:valueArray} Bacon=key and valueArray=value在字典中,对除 Code 行之外的所有行执行此操作。并使用该信息创建一个对象并将其放入列表中
  • AFM 是否总是跟随Code:
  • 是的,AFM 始终存储代码

标签: python python-3.x file


【解决方案1】:
with open(filename, "rt", encoding="utf-8") as f:
    old_list = [] # Saving all the lines including '----' 
       for line in f:
           old_list.append(line)
    new_list = old_list[1:-1] # new list which removes the '----' lines

您可以使用 .split 逻辑遍历 new_list。

【讨论】:

  • 这个问题是文件中有多个收据对不起我没有澄清。我是 Stack Overflow 的新手
  • 请您在此处提供预期的 JSON/dict 输出,考虑文件中的多个收据。
  • 我的意思是代码正确地存储了信息,但不是一个接一个地读取行,而是一个接一个地读取它们,这意味着它跳过了一行。它是代码->培根->总计,但我想go code->eggs->bacon->coffee->total 并读取它的值
【解决方案2】:

看看这是否有效

with open(filename, "rt", encoding="utf-8") as f:
    valueArray = []
    for line in f:
        if not '-' in line:
            if 'Code' in line:
                AFM = line.split(':')[1]
                print(AFM)
                valueArray = []
                products = {}
            else:
                tempProducts = line.split(':')  # Get Product in a list
                productName = tempProducts[0]  # Store Product Name in a variable
                productStats = tempProducts[1]  # Store Product Stats in a list
                productStats_list = productStats.split(" ")
                for value in productStats:
                    valueArray.append(float(value))
                products.update({productName: valueArray})
                if 'TOTAL' in line:
                    rec = Receipt(AFM, products)
                    receipts.append(rec)

【讨论】:

  • 不,对不起,我的意思是代码正确存储了信息,但不是逐行读取,而是两两读取,这意味着它跳过了一行。它来自 code->bacon->total 但是我想去code->eggs->bacon->coffee->total
  • 您已经使用for line in f 遍历您的文件,因此您的代码块中不应有任何其他f.readline。此外,还有一些对我来说没有意义的陈述,prevline 是用来做什么的?我知道 Python 允许这样做,但我建议为新数据类型创建新对象,而不是疯狂地重复使用它们(例如 productStats),line.split() 没有做任何事情
  • 我的输出 {'Bacon': ['1', '3.50', '3.50\n'], 'Total': ['52.90\n']} 但我需要一个包含所有内容的 dict生产线(培根、咖啡、总、鸡蛋)
  • 不是我不愿意帮忙,你只需要提供更多信息
【解决方案3】:

对于现在看到这篇文章的任何人认为它已关闭,我没有提供足够的信息并且代码被搞砸了。很抱歉浪费您的时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多