[英]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.