如何使用条件语句解析.csv

o0lyfsai  于 2023-05-11  发布在  其他
关注(0)|答案(1)|浏览(127)

我在sys. argv的错误处理上遇到了问题。基本上,我希望我的代码检查我是否输入了错误的.csv文件(该目录中实际上不存在的csv文件)作为参数。
我尝试过使用sys.argv和try/else进行错误处理
例如,正确的参数是python3 csvfind.py csvSample.csv,但是假设我输入了一个不存在的.csv文件,所以:python3 csvfind.py csvSample2.csv.我希望我的代码打印('错误!页面没有找到!'),但我一直得到(' No CSV File has been specified '),只有当我不使用任何csv文件作为参数时,才应该输出。我不能让它工作。我做错什么了吗?

try:

    # check if an CSV file has been specified
    if len(sys.argv) < 2:
        raise FileNotFoundError('No CSV File has been specified!')

    else:
        csv_file = sys.argv[1]
        file = open(csv_file, 'r')
        ld = load_data(csv_file)
        print("Source File: " + str(sys.argv[1]))
       

except ValueError:
    print('Error! - File Not Found!')

except TypeError:
    print('Error! - File Not Found!')


except FileNotFoundError:
    print('No CSV File has been specified!')`

输入:

python3 csvfind.py csvSample2.csv

预期输出:

Error! - File Not Found!

实际输出:

No CSV File has been specified
3df52oht

3df52oht1#

我知道您希望缺少一个 * 参数 * 来生成错误,“未指定CSV文件!”,并且希望缺少 * 文件 * 以生成错误“Error!页面未找到!“虽然我可以指出问题所在,但我不知道更大的图景,所以我不知道该推荐什么。不过,我还是会在下面试试。
问题是:您的自定义raise FileNotFoundError("No CSV File...")open(csv_file, 'r')引发相同的异常:文件未找到错误。
当你给予open(...)一个不存在的文件时,open(...)会引发这个异常。因此,对于您所展示的简单代码,您可能永远不会引发一个实际的ValueError来捕获并打印“Error!页面未找到!“.
为了帮助说明这一点,我将您的程序简化为以下内容:

  • 测试args长度,如果sys.argv的值小于2,则抛出FileNotFourndError;或者...
  • 尝试打开第二个参数作为文件,然后打印该参数

我删除了所有的异常处理,这样我们就可以清楚地看到程序生成了什么异常以及它们来自哪里:

import sys

if len(sys.argv) < 2:
    raise FileNotFoundError("No CSV File has been specified!")

csv_file = sys.argv[1]
file = open(csv_file, "r")
print("Source File: " + str(sys.argv[1]))

我的测试目录中只有一个CSV,input1.csv。当我以以下三种不同的方式运行命令时,我得到:

  • 一个真实的文件:
python3 main.py input1.csv

Source File: input1.csv
  • 一个假文件:
python3 main.py input2.csv

  File "/Users/zyoung/develop/StackOverflow/main.py", line 8, in <module>
    file = open(csv_file, "r")
        ^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'input2.csv'
  • 如果没有file参数:
python3 main.py

  File "/Users/zyoung/develop/StackOverflow/main.py", line 5, in <module>
    raise FileNotFoundError("No CSV File has been specified!")
FileNotFoundError: No CSV File has been specified!

我们现在可以清楚地看到,open(...)中的显式raise和隐式raise都是FileNotFoundErrors,这就是为什么你试图建立的两个不同条件会得到相同的错误。
怎么办?
同样,我不知道您的程序的总体情况是什么,所以我假设您正在编写一个命令行实用程序来处理CSV。这些年来,我写了大约一百篇这样的文章,我已经开发了一种“防范”少数的做法/风格,明显的,和可能突然出现的已知的坏先决条件,就像你一样:
1.未指定CSV文件
1.指定的CSV文件不存在

import csv
import os
import sys

# Deal with obvious and expected problems up-front
if len(sys.argv) < 2:
    print("usage: program.py CSV_FILE", file=sys.stderr)
    sys.exit(1)

fname = sys.argv[1]

if not os.path.exists(fname):
    print(f"could not find CSV {fname}", file=sys.stderr)
    sys.exit(1)

# Try to proceed, giving Python as much room to tell us what
# problems actually happened
data = []
try:
    with open(fname, "r", newline="") as f_in:
        reader = csv.reader(f_in)
        data = list(reader)
    print(f"Source File: {fname}")
except Exception as e:
    print(f"error: could not load CSV {fname}: {e}", file=sys.stderr)
    sys.exit(1)

# Do stuff with data...

我尽量避免在一开始就定义太多的异常。我只是去与毯子except Exception as e,并打印它。随着时间的推移,我可能会开始看到我遇到的常见问题,只有这样我才开始编写特殊的错误处理。

相关问题