编写Python函数来迭代行——接受字符串或类似文件的对象

编写Python函数来迭代行——接受字符串或类似文件的对象,python,text-processing,Python,Text Processing,我想编写一个Python函数,它迭代输入参数的行,但可以接受字符串或类似文件的对象。有办法做到这一点吗 def myfunc(x): for line in x: doSomething(line) 上面的代码适用于类似文件的对象,但不适用于字符串,我宁愿只编写一个函数而不是两个函数,因为我真正的任务比上面的复杂得多。它也适用于字符串,但它将逐个字符地迭代字符串。用户应该使用字符串列表来调用函数 如果您明确希望支持传入一个字符串,然后将其解释为一行,则必须测试: def m

我想编写一个Python函数,它迭代输入参数的行,但可以接受字符串或类似文件的对象。有办法做到这一点吗

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)
;这使得类似文件的对象的字符串和行之间的行为基本相同。