从字符串行读取txt文件中的数据

时间:2019-03-26 20:34:16

标签: python

我需要编写一个程序来读取存储在txt文件中的数据。 例如:

  

3147 R 1000
    2168 R 6002
    5984 B 2000
    7086 B 8002

第一个数字是“帐号”,“ R”是住宅分类,最后一个数字是“使用的加仑”。 我需要制作一个程序来打印此:

Account Number: 3147 Water charge: $5.0

我需要让代码读取文本中的4行。居民客户每6000加仑支付$ .005每加仑。更高的$ .007。 商业客户为每8000加仑每加仑支付.006美元。如果更高,则为.008美元。 我需要显示每4行的乘积。 下面的代码是我尝试的。我可能要离开。

我尝试了以下代码:

def main():
    input_file = open('C:\Python Projects\Project 
1\water.txt', 'r')
    empty_str = ''
    line = input_file.readline()

    while line != empty_str:

        account_number = int(line[0:4])
        gallons = float(line[7:11])
        business_type = line[5]
        while business_type == 'b' or 'B':
            if gallons > 8000:
                water_charge = gallons * .008
            else:
                water_charge = gallons * .006
        while business_type == 'r' or 'R':
            if gallons > 6000:
                water_charge = gallons * .007
            else:
                water_charge = gallons * .005

        print("Account number:", account_number, "Water 
 charge:$", water_charge)
        line = input_file.readline()

    input_file.close()
main()

它运行时无需打印任何内容

2 个答案:

答案 0 :(得分:1)

两件事。什么都不出现的原因是因为您陷入了检查业务类型的while循环的无限循环中。将其更改为if语句即可解决。

此外,当您使用and或or或其他运算符时,必须再次指定要比较的变量。

读取文件行的​​while语句应如下所示:

while line != empty_str:

    account_number = int(line[0:4])
    gallons = float(line[7:11])
    business_type = line[5]
    if business_type == 'b' or business_type =='B':
        if gallons > 8000:
            water_charge = gallons * .008
        else:
            water_charge = gallons * .006
    if business_type == 'r' or business_type =='R':
        if gallons > 6000:
            water_charge = gallons * .007
        else:
            water_charge = gallons * .005

    print("Account number:", account_number, "Water charge:$", water_charge)
    line = input_file.readline()

输出:

('Account number:', 3147, 'Water charge:$', 5.0)

答案 1 :(得分:1)

主要问题是您的while循环应该只是if语句:

        if business_type.lower() == 'b':
            if gallons > 8000:
                water_charge = gallons * .008
            else:
                water_charge = gallons * .006

        elif business_type.lower() == 'r':
            if gallons > 6000:
                water_charge = gallons * .007
            else:
                water_charge = gallons * .005

        else:
            # So you don't get a NameError for no water_charge
            water_charge = 0

您的while循环永远不会终止的原因有两个:您永远不会读内循环的 inside 下一行,并且填充的字符串如'b'的计算结果类似于{ {1}}:

True

# Strings with content act like True if 'b': print(True) # True # empty strings act as False if not '': print(False) # False 将小写该字符串,因此str.lower()返回'R'.lower()。否则,'r'没有break条件,它将永远旋转。

其他一些建议:

1)打开文件时,使用while无需显式withopen文件:

close

2)无需显式调用with open('somefile.txt', 'r') as fh: # Everything else goes under the with statement ,因为您可以直接遍历打开的文件:

fh.readline()

这将在with open('somefile.txt', 'r') as fh: for line in fh: # line is the string returned by fh.readline() 为空时终止,或者到达文件末尾;当文件为空时,您可能不会明确获得fh,并且不再需要{{1 }}循环

3)这通常是不好的做法,但也很难维护。例如,如果帐号不完全是5个字符怎么办?一种更简洁的方法是使用'',它将在空格处分割:

while

总计:

str.split(' ')