簡體   English   中英

編寫Python函數以遍歷行—接受字符串或類似文件的對象

[英]writing Python function to iterate over lines — accepting either string or file-like object

我想編寫一個Python函數,該函數在輸入參數的行上進行迭代,但是可以接受字符串或類似文件的對象。 有沒有辦法做到這一點?

def myfunc(x):
   for line in x:
       doSomething(line)

上面的代碼適用於類似文件的對象,但不適用於字符串,我寧願只寫一個函數而不是兩個函數,因為我的真實任務比上面的復雜得多。

使用鴨子輸入:

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)

您可以在這里使用try-except大約一百萬個變體

def myfunc(x):
    try:
       x = x.splitlines(True)
    except AttributeError:
       pass #likely a file

    for line in x:
       doSomething(line)

另一個版本(稍許寬松-請參見評論):

try:
   from cStringIO import StringIO
except ImportError:   #python 3
   from io import StringIO

def myfunc(x):
    try:
       x.seek(0)
    except AttributeError: #likely a string
       x = StringIO(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)

如果您只接受類似文件的對象,則可以指示調用方將字符串參數包裝在StringIO

myfunc(StringIO(s))

isinstance(var,str)檢查var是否為str類型。

我不記得文件的類型,但是您可以找到文件var。 它將顯示在<...>

您可以使用:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM