编写Python函数来迭代行——接受字符串或类似文件的对象
我想编写一个Python函数,它迭代输入参数的行,但可以接受字符串或类似文件的对象。有办法做到这一点吗编写Python函数来迭代行——接受字符串或类似文件的对象,python,text-processing,Python,Text Processing,我想编写一个Python函数,它迭代输入参数的行,但可以接受字符串或类似文件的对象。有办法做到这一点吗 def myfunc(x): for line in x: doSomething(line) 上面的代码适用于类似文件的对象,但不适用于字符串,我宁愿只编写一个函数而不是两个函数,因为我真正的任务比上面的复杂得多。它也适用于字符串,但它将逐个字符地迭代字符串。用户应该使用字符串列表来调用函数 如果您明确希望支持传入一个字符串,然后将其解释为一行,则必须测试: def m
def myfunc(x):
for line in x:
doSomething(line)
上面的代码适用于类似文件的对象,但不适用于字符串,我宁愿只编写一个函数而不是两个函数,因为我真正的任务比上面的复杂得多。它也适用于字符串,但它将逐个字符地迭代字符串。用户应该使用字符串列表来调用函数 如果您明确希望支持传入一个字符串,然后将其解释为一行,则必须测试:
def myfunc(x):
if isinstance(x, basestring):
# Interpret argument as one line
x = [x]
for line in x:
doSomething(line)
或者,您可以在换行符上拆分字符串:
def myfunc(x):
if hasattr(x, 'splitlines'):
# Interpret argument as multiple lines:
x = x.splitlines()
for line in x:
doSomething(line)
它也适用于字符串,但它将逐个字符地迭代字符串。用户应该使用字符串列表来调用函数 如果您明确希望支持传入一个字符串,然后将其解释为一行,则必须测试:
def myfunc(x):
if isinstance(x, basestring):
# Interpret argument as one line
x = [x]
for line in x:
doSomething(line)
或者,您可以在换行符上拆分字符串:
def myfunc(x):
if hasattr(x, 'splitlines'):
# Interpret argument as multiple lines:
x = x.splitlines()
for line in x:
doSomething(line)
使用duck类型:
def myfunc(x):
try:
lines = x.split('\n')
except AttributeError:
lines = x
for line in lines:
doSomething(line)
如果您愿意,还可以检查类型:
def myfunc(x):
if isinstance(x, basestring): # will work in Python >=2.3, <3.x
lines = x.split('\n')
else:
lines = x
for line in lines:
doSomething(line)
def myfunc(x):
如果isinstance(x,basestring):#将在Python>=2.3中工作,使用duck类型:
def myfunc(x):
try:
lines = x.split('\n')
except AttributeError:
lines = x
for line in lines:
doSomething(line)
如果您愿意,还可以检查类型:
def myfunc(x):
if isinstance(x, basestring): # will work in Python >=2.3, <3.x
lines = x.split('\n')
else:
lines = x
for line in lines:
doSomething(line)
def myfunc(x):
如果isinstance(x,basestring):#将在Python>=2.3中工作,如果您只接受类似文件的对象,则可以指示调用者将字符串参数包装到:
如果您只接受类似文件的对象,则可以指示调用者将字符串参数包装为:
这里有大约一百万种变体可用于try,除了
def myfunc(x):
try:
x = x.splitlines(True)
except AttributeError:
pass #likely a file
for line in x:
doSomething(line)
另一个版本(稍微宽松一点——见注释):
这里有大约一百万种变体可用于try,除了
def myfunc(x):
try:
x = x.splitlines(True)
except AttributeError:
pass #likely a file
for line in x:
doSomething(line)
另一个版本(稍微宽松一点——见注释):
isinstance(var,str)检查var是否为str类型
我不记得一个文件的类型,但是你可以通过文件变量来找到。它将在<…>
您可以使用:
def myfunc(x):
for line in x:
if isinstance(line, str):
print line
else:
# Its a file so do file things
isinstance(var,str)检查var是否为str类型
我不记得一个文件的类型,但是你可以通过文件变量来找到。它将在<…>
您可以使用:
def myfunc(x):
for line in x:
if isinstance(line, str):
print line
else:
# Its a file so do file things
一种方法是使用类似isinstance的东西来确定x是否是字符串。如果是,您可以将其传递给StringIO(或cStringIO),使其成为类似文件的对象,然后根据需要继续。我没有对此进行测试,但它大致如下:
def myfunc(x):
if isinstance(x, str):
x = StringIO.StringIO(x)
for line in x:
doSomething(line)
一种方法是使用类似isinstance的东西来确定x是否是字符串。如果是,您可以将其传递给StringIO(或cStringIO),使其成为类似文件的对象,然后根据需要继续。我没有对此进行测试,但它大致如下:
def myfunc(x):
if isinstance(x, str):
x = StringIO.StringIO(x)
for line in x:
doSomething(line)
isinstance(x,basestring)
?@JonClements:我不确定它是什么时候引入的,我正在查找它。:-,2003年7月29日isinstance(x,basestring)
?@JonClements:我不确定它是什么时候引入的,我正在查找它。:-,7月29日,2003@MartijnPieters:谢谢,更新了。顺便说一句,我想知道我知道有多少在Python上运行的积极维护的应用程序安装了一些古老的Zope。@MartijnPieters:谢谢,更新了。顺便说一句,我想知道我知道有多少在Python上运行的活动维护应用程序安装了一些ye-olde Zope;现在,您将自己限制在文件和读取缓冲区(StringIO可以使用的内容)。我宁愿测试迭代器(hasattr(x,'next')
或try:iter(x)
,除了TypeError:
)。iter(“foo”)
和iter(open('file.txt'))
这两种方法都有效。我想我可以使用hasattr(x,'next')
。无论如何,OP的try/except外观在很大程度上取决于API的实际外观。OP刚才说的是字符串和文件对象。如果您想将其扩展到字符串、文件对象和其他iTerable,您可以始终使用我的第一个版本。这里的可能性是无限的,限制性/允许性的范围各不相同(这是我发布2个选项来证明这一点的部分原因)。接受——这里额外的修饰是使用了我不知道的分割线(True)
;这使得类似文件的对象的字符串和行之间的行为基本相同;现在,您将自己限制在文件和读取缓冲区(StringIO可以使用的内容)。我宁愿测试迭代器(hasattr(x,'next')
或try:iter(x)
,除了TypeError:
)。iter(“foo”)
和iter(open('file.txt'))
这两种方法都有效。我想我可以使用hasattr(x,'next')
。无论如何,OP的try/except外观在很大程度上取决于API的实际外观。OP刚才说的是字符串和文件对象。如果您想将其扩展到字符串、文件对象和其他iTerable,您可以始终使用我的第一个版本。这里的可能性是无限的,限制性/允许性的范围各不相同(这是我发布2个选项来证明这一点的部分原因)。接受——这里额外的修饰是使用了我不知道的分割线(True)
;这使得类似文件的对象的字符串和行之间的行为基本相同。