如何从CSV生成的这些字符串中删除所有''?

时间:2017-06-09 17:28:29

标签: python python-3.x csv dictionary pruning

我制作了这个将CSV变成字典的公式:

def CSVtoDict(BDF, mode):
    saved={}
    with open('%s%s.csv' % (dataDir,BDF), mode='r') as infile:
        reader = csv.reader(infile)
        for row in reader:
            if mode is 'prune' and row == '':
                break
            else:
                pass
            key = row[0]
            saved[key]=row[1:]
    return saved

我正在尝试这样做,以便当模式为“剪枝”时,CSV中的任何字符串,例如['data1','data2','','','']都会返回,而不会' ”。但是break语句似乎不是出于某种原因而工作,并且返回的内容就像没有其他内容一样。

你也知道这样做的pythonic方法是什么?我觉得这样可以更有效率......

CSV中的示例行:

意识,ASD,ASD2 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,

5 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,那么您在mode == 'prune'时尝试过滤空行,这是正确的吗?或者你是否试图在空行时立即停止(如果你的条件是正确的话,这是break会达到的效果)?

问题是csv行是作为列表返回的,而不是字符串,即csv文件中的一行,如下所示:

a,b,1,2
在迭代{{1>时,

将作为[' a'' b',' 1'' 2']返回}}。空行显示为reader,而不是[]。如果要检查空行,可以检查''。此外,您的len(row) == 0并未真正做任何事情,因此您可以将其排除在外。结果应该是这样的:

else: pass

如果另一个答案显示,您正在尝试删除任何包含空字段的行,请将for row in reader: if mode is 'prune' and len(row) == 0: break # or continue, if you want to proceed with the rest of the file key = row[0] saved[key]=row[1:] 更改为len(row) == 0

答案 1 :(得分:1)

我认为你可能想要继续而不是休息。 Break会将你带出if / else语句,但是continue会带你进入for循环的下一次迭代。

答案 2 :(得分:1)

条件row == ''表示整行是空字符串。你可以用'' in row代替它:

if mode is 'prune' and '' in row:

答案 3 :(得分:1)

等一下,这就是你想要的吗?如果您要删除所有'' if mode == "prune",请执行以下操作:

def CSVtoDict(BDF, mode):
    with open('%s%s.csv' % (dataDir,BDF), mode='r') as infile:
        reader = csv.reader(infile)
        return [ row for row in reader if row != '' ] if (mode == "prune") else reader

答案 4 :(得分:1)

我认为问题在于你仍然需要遍历每个条目,而不仅仅是每一行。这是我的解决方案:

# CSV contents
#  'data1', 'data2', 'data3', ''
#  'data4', 'data5', '' ''
#  'data6', '', '', ''

def CSVtoDict(BDF, mode):
    saved={}
    with open('%s%s.csv' % (dataDir,BDF), mode='r') as infile:
        reader = csv.reader(infile)
        for row in reader:
            key = row[0]
            saved[key] = [r for r in row[1:] if not (r is '' and mode is 'prune')]
    return saved


# saved will equal
# {
#   'data1': ['data2', 'data3']
#   'data4': ['data5'], 
#   'data6': [], 
# }