1

我制作了这个公式,它将 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 语句似乎不起作用,并且返回的东西好像没有 if else 一样。

你也知道这样做的pythonic方式是什么吗?我觉得这可能会更有效......

CSV 中的示例行:

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

4

5 回答 5

2

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

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

a,b,1,2

迭代时将返回 ['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'' in row.

于 2017-06-09T17:41:15.177 回答
1

我想你可能想使用继续而不是中断。Break 将带您退出 if/else 语句,但 continue 将带您进入 for 循环的下一次迭代。

于 2017-06-09T17:33:20.163 回答
1

条件row == ''意味着整行是一个空字符串。您可以将其替换为'' in row

if mode is 'prune' and '' in row:
于 2017-06-09T17:39:17.157 回答
1

等一下,这是你想要的吗?如果你想删除所有''如果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
于 2017-06-09T17:46:02.123 回答
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': [], 
# }
于 2017-06-09T18:29:53.870 回答