我目前正在上课,我需要一些建议/帮助。我有一个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()
我想删除%,但我没有任何东西;到目前为止,我已经工作了。有什么建议吗?
答案 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
过于复杂的教练学习......那么,你有足够的动力去尝试自己解决问题并在课外提问,这是一件好事。有一些希望......