如何在python中删除列表的特殊字符?

时间:2013-03-20 01:36:28

标签: python function csv strip

我目前正在上课,我需要一些建议/帮助。我有一个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()

我想删除%,但我没有任何东西;到目前为止,我已经工作了。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

没有看到完整的SSCCE样本输入,很难确定,但我愿意打赌问题是这样的:

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

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

我的猜测是你有这样一条线:

foo , 10% , bar

这将分为:

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

因此,您将' 10% '添加到values_list,而rstrip行将不执行任何操作,因为它不会以'%'结尾,而是以' '

或者,也可能就是这样:

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,还是None,或者跳过它,或者做一些不同的事情,但无论您做出什么决定,您都可以考虑在try周围使用float {1}}而不是检查'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,除了保存一行代码之外,你首先不会遇到这个问题 - 对于8个问题也是如此。接下来要遇到的10个问题。

但是,如果你向一位认为csv过于复杂的教练学习......那么,你有足够的动力去尝试自己解决问题并在课外提问,这是一件好事。有一些希望......