我正在使用CSV文件,我可能会从中获取多个值。例如,带有书籍的文件,可能有多个作者,例如{Ben Norrington|Chad Andersson}
。他们一起写了一本书。
在我的代码中,我使用正则表达式按|
进行拆分,然后移除{
和}
。它工作正常。
当我想要返回作者的名字时,问题出现了。我只获得名字,而不是第二名。我如何获得两者?
这是我的代码,它从CSV文件中获取一列。代码用python 2.7
def ifseveral(x):
if "{" not in x and "(" not in x and x != "NULL":
return x
elif "{" in x:
splits =""
splits = x.split("|")
for i in splits:
string = i
string = re.sub('[{}]', '', string)
if "(" in string:
splitpar = ""
splited = string.split("(")
splitpar += splited[0][0:]
return splitpar
else:
**return string** #here is the problem
else:
return "No information available"
答案 0 :(得分:1)
返回会中断循环,因此只会返回第一个分割。您必须调整逻辑,以便将拆分添加到数据结构(甚至是简单的字符串),并在for循环后返回整个结构。 虽然没有经过考验,但这可以胜任。
def ifseveral(x):
if "{" not in x and "(" not in x and x != "NULL":
return x
elif "{" in x:
splits =""
splits = x.split("|")
return_value = ""
for i in splits:
string = i
string = re.sub('[{}]', '', string)
if "(" in string:
splitpar = ""
splited = string.split("(")
splitpar += splited[0][0:]
return splitpar
else:
return_value += string+" "
return return_value
else:
return "No information available
答案 1 :(得分:1)
一个函数只能返回一个对象。该对象可以是一个简单的对象,如整数或字符串,也可以是更复杂的对象,如对象列表,也可以是生成器。
return
语句从函数返回。该功能不会(不能)继续执行。
由于您在return
循环中放置了for
语句,当达到返回时,循环不再继续处理其他数据。
一个解决方案:构建一个列表并将其返回
def ifseveral(x):
# ...
result = []
for string in splits:
# ...
if "(" in string:
splitpar = ""
splited = string.split("(")
splitpar += splited[0][0:]
result.append(splitpar)
else:
result.append(string)
return result
foo = ifseveral("something")
print(foo)
print(len(foo))
for name in foo:
print("One of the names is", name)
另一个解决方案是让你的函数成为一个生成器:
def ifseveral(x):
# ...
for string in splits:
# ...
if "(" in string:
splitpar = ""
splited = string.split("(")
splitpar += splited[0][0:]
yield splitpar
else:
yield string
return result
foo = ifseveral("something")
print(foo)
for name in foo:
print("One of the names is", name)