在Python中删除/替换元组中的错误
我有一串元组的字符串
LL = [ ("text1",2,3,N/A), ("text2",N/A,5,6),("text3",N/A,5,N/A) ]
我需要
LL = [ ("text1",2,3,-1), ("text2",-1,5,6), ("text2",-1,5,-1) ]
所以我想简单地把N/A去掉,换成-1。我需要读取所有行吗?数据下载显示N/A,这不是一个变量。
LL是字符串
使用 ("text2",N/A,5,6)
。
在运行python时,查看 [0]
的类型是'str'。
查看 [1]
的类型时,我没有得到任何输出。
如果我把上面的行分成a, b, c, d,既然我想要的是数字而不是N/A,有没有办法在分割每一行的时候说如果不是数字就换成一个数字(-1)?或者,如果出错就换成-1。
这里还有一个链接,里面有同样的问题,注意[1]有一个N/A。 http://download.finance.yahoo.com/d/quotes.csv?s=GS&f=sb6vt1&e=.csv
在处理数据下载时,CSV字段很麻烦。我该如何使用try/Except格式。
try:
IF XXX or YYY or ZZZ or AAA == 'N/A',
(dont process data...skip to except and pass)
except:
pass
5 个回答
这个列表推导式会遍历LL
中的每一个项目,把字符串"N/A"替换成-1
。
LL = [ ("text1",2,3,"N/A"), ("text2","N/A",5,6),("text3","N/A",5,"N/A") ]
LL = [tuple(x if x != "N/A" else -1 for x in i) for i in LL]
print LL
# [('text1', 2, 3, -1), ('text2', -1, 5, 6), ('text3', -1, 5, -1)]
如果N/A
不是一个字符串,那么你的代码看起来就不太像有效的Python代码,请修改你的帖子,我会尽量调整我的回答。
不幸的是,如果你不知道
编辑:如果LL
是一个字符串,那么正如其他人所说,replace
应该能满足你的需求,这里有一个完整的例子:
LL = '[ ("text1",2,3,N/A), ("text2",N/A,5,6),("text3",N/A,5,N/A) ]'
LL = LL.replace("N/A", "-1")
print LL
# [ ("text1",2,3,-1), ("text2",-1,5,6),("text3",-1,5,-1) ]
根据其他回答的评论,我觉得我明白发生了什么:
LL 是一个字符串,它表示一个元组的列表,类似于这样:
LL = '[ ("text1",2,3,N/A), ("text2",N/A,5,6),("text3",N/A,5,N/A) ]'
这会生成用户428862从另一个系统得到的那种字符串。我们可以用这段代码来替换掉 "N/A" 的值,并把字符串转换成一个可以使用的列表:
import ast
LL_replaced = LL.replace('N/A', '-1')
LL_as_list = ast.literal_eval(LL_replaced)
现在 LL_as_list
是一个元组的列表,原始字符串中 "N/A" 的地方都变成了 -1。这样做是你想要的吗?
你下载的源文件是一个csv文件,不是什么奇怪的python类型。你可以直接使用CSV模块来处理CSV文件,这样会更简单方便,而不是用你自己拼凑的解决方案。
import csv, urllib
rawStockInfo = csv.reader(urllib.urlopen('http://download.finance.yahoo.com/d/quotes.csv?s=GS+AAPL+MSFT+AMZN&f=sb6vt1&e=.csv'))
stocks = [] #list for our cleaned up version
for stock in rawStockInfo:
print stock
#this replaces the string "N/A" with the int -1
stockClean = [-1 if x == 'N/A' else x for x in stock]
stocks.append(stockClean)
print stocks
注意,你可能想把那个列表表达式改成对stock
中单元格的另一个循环……这样可以尝试把任何字符串转换成整数,同时把'N/A'替换成-1。
stockClean = []
for cell in stock:
try:
stockClean.append(int(cell)) #turn the string '4' into the integer 4
except ValueError:
if cell == 'N/A':
stockClean.append(-1)
else:
stockClean.append(cell)