-1

我目前正在为班级做一个项目,我需要一些建议/帮助。我有一个要从中提取数据的 csv 文件。(我没有使用 csv 模块,因为我不熟悉,而且讲师警告我们它很复杂。)我已经使用我创建的函数将数据放入列表中。它工作正常,如果值只是一串数字,但如果单元格中有百分号或“N/A”,那么我会收到错误消息。这是代码:

def get_values(file, index):

    '''(file object, int) -> list
    Return a list of states and corresponding values at a prticular index in file.'''

    values_list = []
    for i in range(6):
        file.readline()
    for line in file:
        line_list = line.split(',')
        values_list.append(line_list[index])
    values_list = [i.rstrip('%') for i in values_list]
    values_list = [float(i) for i in values_list]
    return values_list




while True:
    try:
        file_name = input('Enter in file name: ')
        input_file = open( file_name, 'r')
        break

    except IOError:
         print('File not found.')




heart_list = get_values(input_file, 1)

input_file.close()
input_file = input_file = open( 'riskfactors.csv', 'r')


HIV_list = get_values(input_file, 8)

input_file.close()

我想去掉 %,但到目前为止我还没有尝试过。有什么建议么?

4

1 回答 1

1

如果没有看到带有示例输入的完整SSCCE,很难确定,但我敢打赌,问题是这样的:

values_list = [i.rstrip('%') for i in values_list]

这将'%'去除每个值末尾的任何字符,但不会去除其他任何地方的任何'%'字符。在典型的 CSV 文件中,这还不够好。

我的猜测是你有这样的一行:

foo , 10% , bar

这将分为:

['foo ', ' 10% ', ' bar\n']

因此,您添加' 10% 'to values_list,该rstrip行将什么也不做,因为它不以 a 结尾'%',而是以 a 结尾' '

或者,或者,它可能只是这样:

foo,bar,10%

所以你得到这个:

['foo', 'bar', '10%\n']

......有同样的问题。

如果这个(任何一个版本)是问题,你想要做的是:

values_list = [i.strip().rstrip('%')` for i in values_list]

同时,您可以通过摆脱列表理解来简化此操作。当您可以在添加单个值时修复它们时,为什么还要在事后修复每一行?例如:

for line in file:
    line_list = line.split(',')
    value = line_list[index]
    value = value.rstrip('%')
    value = float(value)
    values_list.append(value)
return values_list

现在,事情很简单,您可以合并多行而不会降低可读性。


当然你还是需要处理的'N/A'。问题是你是否想把它当作0.0, or None, 或者跳过它,或者做一些不同的事情,但无论你决定什么,你都可以考虑使用tryaround thefloat而不是检查 for 'N/A',以使你的代码更健壮。例如:

value = value.rstrip('%')
try:
    value = float(value)
except ValueError as e:
    # maybe log the error, or log the error only if not N/A, or...
    pass # or values_list.append(0.0), or whatever
else:
    values_list.append(value)

顺便说一句,处理这类事情正是您应该使用该csv模块的原因。

这是您如何使用csv. 而不是这个:

for line in file:
    line_list = line.split(',')

只需这样做:

for line_list in csv.reader(file):

这很复杂?

它通过去除空格(以及引用和转义以及您会忘记测试的各种其他废话)来处理所有微妙之处。

换句话说,很可能,如果你使用csv了 ,除了节省一行代码之外,你一开始就不会遇到这个问题——接下来的 10 个问题中的 8 个也是如此碰到。

但是如果你是从一个认为csv太复杂的导师那里学习的……好吧,你有足够的动力去尝试自己解决问题并在课外提出问题,这是一件好事,所以有一些希望……</p>

于 2013-03-20T01:40:54.170 回答