我制作了这个将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 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,
答案 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': [],
# }