0

这是我几乎完成的任务。所以目标是能够根据CID搜索列表,CID是txt文件每一行的第一个值。

文本文件包含以下记录,并以制表符分隔:

0001    001 --  --  1234.00 --  --  148.08  148.08  13.21   1395.29
0002    011 --  100.00  12000.00    --  5.00    1440.00 1445.00 414.15  13959.15
0003    111 100.00  1000.00 1000.00 8.00    50.00   120.00  178.00  17.70   2295.70
0004    110 1200.00 100.00  --  96.00   5.00    --  101.00  6.15    1407.15
0005    101 100.00  --  1300.00 8.00    --  156.00  164.00  15.60   1579.60
0006    100 1200.00 --  --  96.00   --  --  96.00   5.40    1301.40
0007    010 --  1500.00 --  --  75.00   --  75.00   2.25    1577.25
0008    001 --  --  1000.00 --  --  120.00  120.00  9.00    1129.00
0009    111 1000.00 1000.00 1000.00 80.00   50.00   120.00  250.00  28.50   3278.50
0010    111 100.00  10000.00    1000.00 8.00    500.00  120.00  628.00  123.90  11851.90

文本文件可以在这里找到。

我是 Python 新手,还没有完全理解它。我需要能够以某种方式动态填充lines[0]其他索引位置。例如...'0002' 在索引 [0] 中找到,如果我更改为,则找到 0002 lines[1],依此类推。我尝试了各种时间,枚举,列表理解,但其中大部分超出了我的理解。或者也许有一种更简单的方法来显示特定“客户”的线路?

   with open('customer.txt', 'r') as file:

        for line in file:
            lines = file.read().split('\n')
    search = input("Please enter a CID to search for: ")

    if search in lines[0]:
        print(search, "was found in the database.")
        CID = lines[0]
        print(CID)
    else:
        print(search, "does not exist in the database.")
4

3 回答 3

2

不确定,是否应该以某种方式将这些行拆分为字段?

search = input("Please enter a CID to search for: ")
with open('customer.txt', 'r') as file:
    for line in file:
        fields = line.split('\t')
        if fields[0] == search:
            print(search, "was found in the database.")
            CID = fields[0]
            print(line)
            break
    else:
        print(search, "does not exist in the database.")
于 2013-05-25T06:06:58.043 回答
1

以下是我认为您应该解决此问题的方法。代码下方的注释。

_MAX_CID = 9999
while True:
    search = input("Please enter a CID to search for: ")
    try:
        cid = int(search)
    except ValueError:
        print("Please enter a valid number")
        continue
    if not 0 <= cid <= _MAX_CID:
        print("Please enter a number within the range 0..%d"% _MAX_CID)
        continue
    else:
        # number is good
        break

with open("customer.txt", "r") as f:
    for line in f:
        if not line.strip():
            continue # completely blank line so skip it
        fields = line.split()
        try:
            line_cid = int(fields[0])
        except ValueError:
            continue # invalid line so skip it

        if cid == line_cid:
            print("%d was found in the database." % cid)
            print(line.strip())
            break
    else:
        # NOTE! This "else" goes with the "for"!  This case
        # will be executed if the for loop runs to the end
        # without breaking.  We break when the CID matches
        # so this code runs when CID never matched.
        print("%d does not exist in the database." % cid)
  • 我们不是搜索文本匹配,而是将用户的输入解析为数字并搜索数字匹配。因此,如果用户输入 0,文本匹配将匹配示例文件的每一行,但数字匹配将不匹配任何内容!

  • 我们接受输入,然后将其转换为整数。然后我们检查它是否有意义(不是负数或太大)。如果它没有通过任何测试,我们会继续循环,让用户重新输入。一旦它是一个有效的数字,我们就会跳出循环并继续。(您的老师可能不喜欢我break在这里使用的方式。如果它让您的老师更开心,请添加一个名为的变量,该变量done最初设置为False,并True在输入验证时将其设置为 ,然后进行循环while not done:)。

  • 您似乎对输入有点困惑。当你打开一个文件时,你会得到一个代表打开文件的对象。你可以对这个对象做几件事。您可以做的一件事是使用.readlines()or之类的方法函数.read(),但您可以做的另一件事就是迭代它。要迭代它,你只需将它放在一个for循环中;当你这样做时,每次循环迭代都会从文件中获取一行输入。所以我的代码示例line每次都将变量设置为文件中的一行。如果您使用该.read()方法,您会一次性将整个文件放入内存中,这不是必需的;然后你的循环不会循环文件的行。通常你应该使用for line in f:那种循环;有时您需要使用f.read(); 你永远不会同时做这两件事。

  • 这是一个小问题,但file它是 Python 中的内置类型,通过分配给它,您正在重新绑定名称,并“隐藏”内置类型。为什么不像f我在程序中那样简单地使用?或者,使用类似in_file. 当我同时拥有一个输入文件和一个输出文件时,我通常使用in_fileand out_file.

  • .split()一旦我们有了这条线,我们就可以使用方法函数将它分成多个字段。然后代码将第 0 个字段强制为整数并检查是否完全匹配。

  • 此代码检查输入行,如果它们不起作用,则静默跳过该行。那是你要的吗?也许不吧!如果数据库文件格式错误,也许代码会更好。continue然后,您可能不想使用该语句,而是要放入一个raise语句并引发异常。也许定义你自己的异常,我认为MalformedDatabase它应该是一个子类。ValueError

  • 这段代码使用了 Python 的一个非常独特的特性,即循环else语句。for这适用于仅在循环一直运行到结束时才执行的代码,没有提前退出。当循环找到客户 ID 时,它会以一条break语句提前退出;当永远找不到客户 ID 时,循环运行到最后并执行此代码。

  • 这段代码实际上可以在 Python 2.x 上正常工作,但错误检查还不够充分。如果你在 Python 3.x 下运行它,它会被很好地检查。我假设您使用 Python 3.x 来运行它。如果你用 Python 2.x 运行它,输入xxx或疯狂垃圾之类的0zz,你会得到不同的异常,而不仅仅是ValueError被测试的!(如果您真的想在 Python 2.x 中使用它,您应该更改input()为,或在/raw_input()中捕获更多异常。)tryexcept

于 2013-05-25T06:43:07.027 回答
0

另一种方法。由于文件是制表符分隔的,因此您也可以使用该csv模块

与@gnibbler 的答案不同,这种方法将读取整个文件,然后搜索其内容(因此它将文件加载到内存中)。

import csv

with open('customer.txt') as file:
   reader = csv.reader(file, delimiter='\t')
   lines = list(reader)

search = input('Please enter the id: ')
result = [line for line in lines if search in line]
print '\t'.join(*result) if result else 'Not Found'
于 2013-05-26T04:42:11.787 回答