2013-03-20 203 views
-1

我目前正在为课程做一个项目,我需要一点建议/帮助。我有一个csv文件,我从中提取数据。 (我没有使用csv模块,因为我不熟悉,教师警告我们这很复杂。)我使用我创建的函数将数据获取到列表中。它工作正常,如果这些值只是一串数字,但如果在单元格中存在百分号或“N/A”,则会出现错误。这里是代码:如何去除python中的列表中的特殊字符?

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() 

我想剥离%,但没有我,我已经工作到目前为止。有什么建议么?

+0

csv并不复杂,它可能会让你的生活更容易 – jamylak 2013-03-20 02:08:10

回答

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.0None,或者跳过它,或者做一些不同的事情,但无论你决定如何,你可以考虑在float周围使用try而不是检查'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次中也会出现这种情况你将遇到的问题。

但是,如果你从一位认为csv太复杂的教练身上学习......那么,你有足够的动机试图为自己弄清楚问题并在课堂以外提问,这是一个希望...

+0

谁downvoted,关心解释为什么? – abarnert 2013-03-20 19:13:09

+0

我想知道同样的事情。我认为这是一个相关的问题,我在寻求帮助之前一遍又一遍地在这段代码中工作。 – user2188956 2013-03-21 12:52:23

+0

这个项目如果是编程101类,我猜是因为教科书没有通过csv模块,教练觉得如果我们必须自己去学习csv模块,那将会是太多的工作。再次感谢@abarnert给我这样一个详细的回答,我确实发现csv比我试图做的更容易使用。 – user2188956 2013-03-21 12:56:32