web-dev-qa-db-ja.com

Pythonで文字列が空かどうか調べる最もエレガントな方法は?

Pythonには空の文字列変数のようなものがありますか。

if myString == string.empty:

とにかく、空の文字列値をチェックするための最もエレガントな方法は何ですか?私は空の文字列をチェックするために""を毎回ハードコーディングするのはそれほど良くないと思います。

1140
Joan Venge

空の文字列は "falsy" で、これはブール値のコンテキストではfalseと見なされるため、次のようにします。

if not myString:

あなたの変数が文字列であることを知っているなら、これは好ましい方法です。もしあなたの変数が他の型である可能性があるなら、myString == ""を使うべきです。ブール値の文脈で偽となる他の値については 真理値テスト のドキュメントを参照してください。

1585
Andrew Clark

「PEP 8 」から、 「プログラミングの推奨事項」のセクション

シーケンス(文字列、リスト、タプル)の場合、空のシーケンスはfalseであるという事実を使用します。

だからあなたが使用する必要があります:

if not some_string:

または

if some_string:

明確にするために、シーケンスが空かどうかにかかわらず、シーケンスは 評価された に対してブール値のコンテキストでFalseまたはTrueになります。それらは 等しくない FalseまたはTrueです。

328
zenpoy

最も洗練された方法は、おそらくその真実か偽造かを単にチェックすることでしょう。例えば:

if not my_string:

ただし、次の理由で空白を削除することがあります。

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

ただし、この文字列が何らかの種類の検証に合格し、この方法でテストできる文字列であることが確実にわかっている場合を除いて、これについてはもう少し明示的に説明します。

183
Bartek

私はストリッピングする前に何もテストしないでしょう。また、空の文字列はFalse(またはFalsy)であるという事実を使用します。この方法は、 ApacheのStringUtils.isBlank または GuavaのStrings.isNullOrEmpty と似ています。

これは文字列がNone OR Empty OR Blankのいずれかであるかどうかをテストするために使用するものです。

def isBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return False
    #myString is None OR myString is empty or blank
    return True

そして、文字列がNone NORでないかどうかをテストするのとは正反対です[Empty NOR Blank:

def isNotBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return True
    #myString is None OR myString is empty or blank
    return False

上記のコードのより簡潔な形式:

def isBlank (myString):
    return not (myString and myString.strip())

def isNotBlank (myString):
    return bool(myString and myString.strip())
66
rouble

私はかつてBartekの答えに似たようなものを書き、JavaScriptに触発されました。

def is_not_blank(s):
    return bool(s and s.strip())

テスト:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False
30
vault

これを行う唯一の本当に確実な方法は次のとおりです。

if "".__eq__(myString):

他のすべてのソリューションには、考えられる問題と、チェックが失敗する可能性のあるEdgeのケースがあります。

myStringstrを継承し、len(myString)==0メソッドをオーバーライドするクラスのオブジェクトである場合、__len__()は失敗する可能性があります。

同様に、myStringmyString.__eq__("")および__eq__()をオーバーライドすると、myString == ""および__ne__()は失敗する可能性があります。

何らかの理由で、myString__eq__()をオーバーライドすると、"" == myStringもだまされます。

myString is """" is myStringは同等です。 myStringが実際には文字列ではなく、文字列のサブクラスである場合、両方とも失敗します(両方ともFalseを返します)。また、これらはIDチェックであるため、Pythonがストリングプーリング(ストリングインターンメントとも呼ばれます)を使用するため、唯一の理由は、ストリングがインターンされた場合にストリングの同じインスタンスを使用するためです(こちらを参照:- 「==」または「is」のいずれかを使用して文字列を比較すると、異なる結果が生成されることがあるのはなぜですか? )そして、""はCPythonの最初からインターンされます

IDチェックの大きな問題は、String Internmentが(私が知る限り)どのストリングがインターン化されるかが標準化されていないことです。つまり、理論的には""はインターンする必要はなく、実装に依存します。

本当にだまされないこれを行う唯一の方法は、冒頭で述べた"".__eq__(myString)です。これは空の文字列の__eq__()メソッドを明示的に呼び出すため、myStringのメソッドをオーバーライドしてもだまされず、strのサブクラスで確実に動作します。

また、オブジェクトが__bool__()メソッドをオーバーライドする場合、文字列の偽りに依存することは機能しない可能性があります。

これは理論的な作業であるだけでなく、実際に使用に関連する場合があります。フレームワークとライブラリがstrをサブクラス化し、myString is ""をサブクラス化する前に間違った出力を返す可能性があるからです。

また、一般的にisを使用して文字列を比較することは、文字列プーリングがかなり奇妙な規則に従うため、時には正しく動作するが、時には動作しないため、非常に悪いトラップです。

とはいえ、ほとんどの場合、前述のソリューションはすべて正常に機能します。これは、ほとんどが学術的な仕事です。

14
Dakkaron

空または空白の文字列をテストします(より短い方法)。

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")
12
prrvchr

空文字列とnull文字列を区別したい場合はif len(string)を使用することをお勧めします。それ以外の場合は、他の人が言っているように単にif stringを使用することをお勧めします。空白でいっぱいの文字列についての警告はまだ適用されます、従ってstripを忘れないでください。

9
Silas Ray
if my_string is '':

私は答えのどれにもその特定の組み合わせに気づいていません。探した 

is ''

投稿前の回答に。 

 if my_string is '': print ('My string is EMPTY') # **footnote

私はこれがオリジナルのポスターが到達しようとしていたものであると思います。 

if my_string is '':
    print('My string is EMPTY')
else:
    print(f'My string is {my_string}')

キャラクターのキャラクター私はこの解決策が良いと思います。

私はNoneが議論に加わったことに気づいたので、それを加えてさらに圧縮すると、

if my_string is '': print('My string is Empty')
Elif my_string is None : print('My string.... isn\'t')
else: print(f'My string is {my_string}')
9
MikeyB
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True
6
Roman Semirook

文字列が空の場合、if stringname:falseを返します。これ以上簡単にはできないと思います。

5
Kakashi

空の文字列をチェックするために毎回ハードコーディング( "sic")をするのが良くありません。

クリーンコードアプローチ

これをすること:foo == ""はとても悪い習慣です。 ""は魔法の価値です。あなたは決して魔法の値をチェックしてはいけません(より一般的には 魔法の数字 として知られています)

あなたがすべきことは記述変数名と比較することです。

記述的な変数名

"empty_string"は説明的な変数名だと思うかもしれません。 それは ではありません。

始める前にempty_string = ""を実行して、比較するべき素晴らしい変数名があると思います。これは「記述的な変数名」が意味するものではありません。

わかりやすい変数名は、そのコンテキストに基づいています。空の文字列であることを考える必要があります。

  • それはどこから来たのですか。 
  • それはなぜですか。 
  • なぜあなたはそれをチェックする必要がありますか。

単純なフォームフィールドの例

ユーザーが値を入力できるフォームを作成しています。ユーザーが何か書いたかどうかを確認したいです。

良い変数名はnot_filled_inかもしれません

これはコードを非常に読みやすくする

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

完全なCSV解析の例

CSVファイルを解析していて、空の文字列をNoneとして解析する必要があります。

(CSVは完全にテキストベースであるため、定義済みのキーワードを使用せずにNoneを表すことはできません)

良い変数名はCSV_NONEかもしれません

これにより、None""以外の文字列で表す新しいCSVファイルがある場合、コードを簡単に変更して適応させることができます。

if csvfield == CSV_NONE:
    csvfield = None

このコードが正しいかどうかについての質問はありません。それがやるべきことをしているのは明らかです。

これと比較して

if csvfield == EMPTY_STRING:
    csvfield = None

ここでの最初の質問は、「空の文字列はなぜ特別な扱いに値するのですか?」です。

これは将来のコーダーに空の文字列は常にNoneと見なされるべきであることを伝えます。

これは、ビジネスロジック(どのCSV値がNoneであるべきか)とコード実装(実際に何を比較しているのか)を組み合わせているためです。

懸念の分離 2つの間にある必要があります。

4
firelynx

次のどちらか

foo is ''

あるいは

empty = ''
foo is empty
4
geckos

これはどう?おそらくそれは「最もエレガント」ではありませんが、かなり完全で明確なようです。

if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
3
BuvinJ

@ 1290に返信します。コメントでブロックをフォーマットする方法はありません。 Noneの値はPythonでは空の文字列ではなく、また(空白)でもありません。 Andrew Clarkからの答えは正しいものです:if not myString。 @roubleからの回答はアプリケーション固有のものであり、OPの質問には答えません。あなたが "空の"文字列とは何かについての独特の定義を採用するならば、あなたは悩みの種になるでしょう。特に、標準的な振る舞いはstr(None)'None'という空でない文字列を生成することです。

しかし、Noneと(spaces)を "空白"の文字列として扱わなければならない場合は、こちらがより良い方法です。

class weirdstr(str):
    def __new__(cls, content):
        return str.__new__(cls, content if content is not None else '')
    def __nonzero__(self):
        return bool(self.strip())

例:

>>> normal = weirdstr('Word')
>>> print normal, bool(normal)
Word True

>>> spaces = weirdstr('   ')
>>> print spaces, bool(spaces)
    False

>>> blank = weirdstr('')
>>> print blank, bool(blank)
 False

>>> none = weirdstr(None)
>>> print none, bool(none)
 False

>>> if not spaces:
...     print 'This is a so-called blank string'
... 
This is a so-called blank string

文字列の期待されるboolの動作を壊すことなく、@ troubleの要件を満たします。

2
Chris Johnson
not str(myString)

この式は、空の文字列に対してはTrueです。空でない文字列、None、および文字列でないオブジェクトはすべてFalseを生成します。オブジェクトが__str__をオーバーライドして偽の値を返すことでこのロジックを妨害する可能性があるという警告があります。

1
Fax
str = ""
if not str:
   print "Empty String"
if(len(str)==0):
   print "Empty String"
0
Tanmoy Datta

もう1つの簡単な方法は、単純な関数を定義することです。

def isStringEmpty(inputString):
    if len(inputString) == 0:
        return True
    else:
        return False
0
tanzil

あなただけの場合 

not var1 

空の文字列''とブール値Falseの変数を区別することは不可能です。

var1 = ''
not var1
> True

var1 = False
not var1
> True

ただし、スクリプトに単純な条件を追加すると、違いが生じます。

var1  = False
not var1 and var1 != ''
> True

var1 = ''
not var1 and var1 != ''
> False
0
jberrio

この Pythonでは空の値または文字列を代入する をご覧ください。

これは空の文字列を比較することです。それで、notで空虚さをテストする代わりに、あなたはあなたの文字列が""空の文字列で空の文字列と等しいかどうかをテストするかもしれません...

0
octoback

これが誰かに役立つ場合には、ここにリストのリストの中の空白の文字列をN/Aのものに置き換えるために作った簡単な関数があります(python 2)。

y = [["1","2",""],["1","4",""]]

def replace_blank_strings_in_lists_of_lists(list_of_lists):
    new_list = []
    for one_list in list_of_lists:
        new_one_list = []
        for element in one_list:
            if element:
                new_one_list.append(element)
            else:
                new_one_list.append("N/A")
        new_list.append(new_one_list)
    return new_list


x= replace_blank_strings_in_lists_of_lists(y)
print x

これは、特定のフィールド(スキーマでNNとマークされているフィールド。私の場合は、複合主キーが原因)の空白を受け付けないmysqlデータベースにリストのリストを投稿するのに役立ちます。

0
FlyingZebra1

apache StringUtils.isBlank またはGuava Strings.isNullOrEmpty のような動作を期待する人のために

if mystring and mystring.strip():
    print "not blank string"
else:
    print "blank string"
0
kommradHomer

それが文字列であることを確認してその長さをチェックするので、私はこれがエレガントだと思います:

def empty(mystring):
    assert isinstance(mystring, str)
    if len(mystring) == 0:
        return True
    else:
        return False
0
cardamom

ファイルを行単位で読み込んでいて、どの行が空であるかを判断したい場合は、必ず ".strip()"を使用するようにしてください。 "empty"行には改行文字があるからです。

lines = open("my_file.log", "r").readlines()

for line in lines:
    if not line.strip():
        continue

    # your code for non-empty lines
0
Pavel Štěrba