【问题标题】:Python: How to print just one line within a loopPython:如何在循环中只打印一行
【发布时间】:2021-04-07 07:41:48
【问题描述】:

我只是想简单地覆盖我的程序中的一个错误,我已经使用了 try 和 except 函数。这是我的代码:

import csv
import sys

with open('fake.csv') as csvfile:
    sched = csv.reader(csvfile, delimiter=',')

    for row in sched:
        a = row[1]
        try:
            if (a == sys.argv[1]):
                print(row)
        except Exception:
            print("Sorry. Try again.")

这确实有效,但不是只打印一行,而是根据我的 csv 文件重新打印,该文件有 6 行,因此打印出来:

Sorry. Try again.
Sorry. Try again.
Sorry. Try again.
Sorry. Try again.
Sorry. Try again.
Sorry. Try again.

我知道这是因为它来自循环内,但这是由于 csv 文件需要成为循环才能打印出正确的结论。有什么方法可以只打印一行说“抱歉,当任何输入与 csv 中的任何内容都不匹配时再试一次。

提前致谢!

【问题讨论】:

  • 请使用代码块编写代码,以便以等宽字体显示以提高可读性。另外请添加正确的缩进,因为代码在语法上不正确。
  • try/except 在这里似乎没有做任何有用的事情。我可以看到它捕获的唯一例外是命令行上没有提供任何参数。这一定是为了让你得到你得到的输出,在这种情况下,无论如何都没有编辑来打破循环是有用的。您应该尝试解决错误而不是忽略它们,因为无论您做什么,忽略它们都会使您的程序无法正常工作。

标签: python


【解决方案1】:

Svrem 的解决方案完全按照您的要求进行,我在此基础上对其进行了投票 - 但是根据经验,尝试读取 csv 文件时出现单一错误消息并不是很有用。您最终可能想要的是一些关于哪些线路不好的指导。我建议以下内容:

import csv
import sys

badLines = []
with open('fake.csv') as csvfile:
    sched = csv.reader(csvfile, delimiter=',')
    
    iRows = 1  #iRows is a counter for the current row in the CSV we are on
    for row in sched:
        a = row[1]
        
        #Below is edited to amend nonsensical code (which is in source) as pointed out by Kemp
        if len(sys.argv) > 1:
            if (a == sys.argv[1]):
                print(row)
            else:
                badLines.append(iRows)  
        else:
            print("Are you missing a command line argument to this function?")

        iRows = iRows + 1  

if badLines:
    print("bad line entries in CSV found, these are")
    print(badLines)  #You could of course wrap this into the one print statement, but this is a simple and clear solution, so why bother

【讨论】:

  • 这里的 try/except 到底是做什么的?我可以看到它捕获的唯一例外是 IndexError 访问 sys.argv,这与 csv 行无关。
  • 在不知道 csv 文件中的内容的情况下,它看起来像是将 csv 文件每一行中的第二个条目与从命令行调用时传递给此函数的参数进行比较。如果它们匹配,那么很好,如果不匹配,那就是一个问题。我它可能希望确保数据的一致性。
  • 除非不匹配不会引发异常。正如我所说,如果用户忘记提供命令行参数,它会捕获的唯一异常是IndexError。它被表述为“试图覆盖我的程序中的错误”这一事实让我认为这正是发生的事情,而不是试图弄清楚为什么他们得到了异常,他们只是在那里坚持了一个 try/except 以摆脱它仍然没有给出所需的参数。
  • 好点。将重新调整以至少连贯。
【解决方案2】:

您可以尝试添加一个 break 语句。这将打破循环。

所以你的情况是:

import csv

import sys

with open('fake.csv') as csvfile:

    sched = csv.reader(csvfile, delimiter=',')

    for row in sched:

        a = row[1]

        try:

            if (a == sys.argv[1]):

                print(row)

        except Exception:

            print("Sorry. Try again.")
            break

【讨论】:

  • 这并不能解决所提出的问题。如果提供的字符串与 csv 中的 anything 不匹配,他们希望打印一条消息,而不是在第一次遇到不匹配的内容时打印它并退出循环。另请参阅我的其他 cmets,了解 try/except 可能不是他们想要的。
  • Kemp,很抱歉我的回答不适合你。但是 OP 并没有为 try 语句要求花哨的工作。他(在我看来)要求一种只打印一次的方法。所以我的解决方案正是他想要的。再次在我看来。
  • 来自问题:“有什么方法可以打印一行说“对不起,当任何输入与 csv 中的任何内容都不匹配时再试一次。”您的解决方案根本不执行“不匹配”部分,它会检查用户是否在命令行中输入了参数。在您的解决方案中,打印消息 doesn't have nothing to do with matches。即使它正在检查匹配项(我要强调的是,它不是),您的解决方案也会在第一次出现不匹配时打印消息并退出,而不是在没有匹配项时退出。
【解决方案3】:

我认为其他答案是通过调整您拥有的代码来回答错误的事情。 try/except 没有做你想做的事。如果您忘记在命令行上提供参数,它将捕获的唯一异常是IndexError,这不是您所描述的使用它的目的。

如果您只想在没有匹配行的情况下显示消息,那么您需要跟踪匹配的行数,例如:

import csv
import sys

count = 0

with open('fake.csv') as csvfile:
    sched = csv.reader(csvfile, delimiter=',')

    for row in sched:
        if (row[1] == sys.argv[1]):
            print(row)
            count += 1

if count == 0:
    print("Sorry, try again.")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2021-01-30
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多