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