我有一些在Python下操作
随着Python3的字符串/字节变革,如果以二进制模式打开
在我的代码中,多次调用
一种可能的方法是检查
file
对象的代码。随着Python3的字符串/字节变革,如果以二进制模式打开
file
,那么file.read()
将返回bytes
。相反,如果以文本模式打开file
,则file.read()
将返回str
。在我的代码中,多次调用
file.read()
,因此每次调用file.read()
都检查结果类型是不切实际的,例如:def foo(file_obj):
while True:
data = file.read(1)
if not data:
break
if isinstance(data, bytes):
# do something for bytes
...
else: # isinstance(data, str)
# do something for str
...
我希望有一些可靠的方法来检查 file.read()
的结果,例如:
def foo(file_obj):
if is_binary_file(file_obj):
# do something for bytes
while True:
data = file.read(1)
if not data:
break
...
else:
# do something for str
while True:
data = file.read(1)
if not data:
break
...
一种可能的方法是检查
file_obj.mode
,例如:import io
def is_binary_file(file_obj):
return 'b' in file_obj.mode
print(is_binary_file(open('test_file', 'w')))
# False
print(is_binary_file(open('test_file', 'wb')))
# True
print(is_binary_file(io.StringIO('ciao')))
# AttributeError: '_io.StringIO' object has no attribute 'mode'
print(is_binary_file(io.BytesIO(b'ciao')))
# AttributeError: '_io.BytesIO' object has no attribute 'mode'
如果传入的是io
中的对象,比如io.StringIO()
和io.BytesIO()
,那么方法将会失败。
另外一种方法,可以适用于io
对象,就是检查encoding
属性,例如:
import io
def is_binary_file(file_obj):
return not hasattr(file_obj, 'encoding')
print(is_binary_file(open('test_file', 'w')))
# False
print(is_binary_file(open('test_file', 'wb')))
# True
print(is_binary_file(io.StringIO('ciao')))
# False
print(is_binary_file(io.BytesIO(b'ciao')))
# True
有更简洁的方法来执行这个检查吗?