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

How do I prune all the '' from these strings generated from a CSV?

我制作了这个将 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

我试图做到这一点,以便当模式为 'prune' 时,来自 CSV 的任何字符串,例如 ['data1'、'data2'、''、''、 ''] 不带任何 '' 返回。但是由于某种原因,break 语句似乎不起作用,并且返回的东西就好像没有 if else 一样。

您还知道执行此操作的 pythonic 方式是什么吗?我觉得这样会更有效率...

CSV 中的示例行:

意识,ASD,ASD2, ,

我认为您可能想要使用 continue 而不是 break。 Break 将带您退出 if/else 语句,但 continue 将带您进入 for 循环的下一次迭代。

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

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

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

问题是 csv 行返回为列表,而不是字符串,即 csv 文件中的一行看起来像这样:

a,b,1,2
当遍历 reader 时,

将返回为 ['a','b','1','2']。空行显示为 [],而不是 ''。如果要检查空行,可以改为检查 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 更改为 '' in row

等等,这是你想要的吗?如果你想删除所有 '' 如果 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

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

# 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': [], 
# }