文字列が空かどうかを確認するにはどうすればよいですか?


1420

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

if myString == string.empty:

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


2
どのように""良くないのですか?
NoName

回答:


2117

空の文字列は「偽」であり、ブールコンテキストではfalseと見なされるため、次のようにすることができます。

if not myString:

これは、変数が文字列であることがわかっている場合に推奨される方法です。変数が他の型になる可能性がある場合は、を使用する必要がありますmyString == ""。ブール値のコンテキストでfalseとなる他の値については、真理値テストに関するドキュメントを参照してください。


183
他にもたくさんのことが間違っているので注意してください。
Ignacio Vazquez-Abrams

9
私はこれまで、偽という用語を聞いたことがありません。それはfalseを返すという意味ですか?
Joan Venge、2012年

41
@Joan:ブール値のコンテキストではfalseと評価されます。
Ignacio Vazquez-Abrams

54
OPは、変数が空の文字列であるかどうかを知りたがっていますが、 if not myString:ですmyStringNone、も0Falseなどの場合はブロックをます。そのmyStringため、型がわからない場合は、を使用if myString == "":して、空の文字列かどうかを判断する必要があります。他の偽の値。
Andrew Clark

15
@AndrewClark、そのような場合、一連のif myString == ...式の代わりに、if myString in (None, '')または@Bartekごとに、if myString in (None, '') or not myString.strip()
Stew

414

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

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

だからあなたは使うべきです:

if not some_string:

または:

if some_string:

明確にするために、シーケンスは次のように評価されますFalseTrueが空であるかどうかにかかわらず、ブールコンテキストまたはブールコンテキストでます。彼らは同じではないFalseTrue


24
PEPへの参照を含めてよかった!
Felix

3
PS:PEPの弁護では、「xは偽である」(小文字の)と言うことは、という意味ではなく、それをすでに意味していると主張することができx == Falseます。しかし、IMHOは、対象読者を考慮して、説明を歓迎します。
MestreLion 2016年

234

最もエレガントな方法は、おそらくそれが本当か偽物かを単にチェックすることでしょう、例えば:

if not my_string:

ただし、次の理由により、空白を削除したい場合があります。

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

ただし、この文字列がある種の検証に合格し、この方法でテストできる文字列であることが確かでない場合を除いて、おそらくこれをもう少し明示する必要があります。


88

剥ぎ取る前に私は無についてテストしました。また、空の文字列はFalse(またはFalsy)であるという事実を使用します。このアプローチは、ApacheのStringUtils.isBlankまたはGuavaのStrings.isNullOrEmptyに似ています

これは、文字列がNoneまたはEmptyまたは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空でないNOR空でないかどうかをテストするのとは正反対です:

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())

なんでif mystring and not mystring.strip()
ミゴール

1
どう違うのstring and not string.isspace()
Andrea Corbellini、2015年

7
そのようなことを気にする人にとってはより簡潔です:def isBlank(s): return not (s and s.strip())def isNotBlank(s): return s and s.strip()
Carl

49

私はかつて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

なぜだけではなくreturn bool(s.strip())
anilbey

1
AttributeError: 'NoneType' object has no attribute 'strip'
ボールト

28

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

if "".__eq__(myString):

他のすべての解決策には、問題が発生する可能性があり、チェックが失敗する可能性のある場合があります。

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

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

何らかの理由でオーバーライドした"" == myString場合もだまされmyStringます__eq__()

myString is """" is myString同等です。myStringが実際には文字列ではなく文字列のサブクラスである場合、どちらも失敗します(どちらもが返されますFalse)。彼らは身元確認、彼らの仕事は、Pythonは、それがインターンされている場合、文字列の同じインスタンスを使用しています(また、文字列抑留呼ばれる)文字列プールを使用しているので、唯一の理由であることからも、(ここを参照してください:なぜはどちらか使用して文字列を比較するん「= = 'または' is 'は異なる結果を生成することがありますか?)。そして"" CPythonで最初からインターンされています

アイデンティティチェックの大きな問題は、文字列インターンメントが(私が知る限り)インターンされている文字列が標準化されていないことです。つまり、理論的には""はインターンする必要はなく実装に依存します。

これを実際にだますことができない唯一の方法は、冒頭で述べた方法です"".__eq__(myString)。これは明示的に__eq__()空の文字列のメソッドを呼び出すので、myStringのメソッドをオーバーライドしてだまされてはならず、以下のサブクラスで確実に機能しますstrます。

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

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

また、使用して文字列を比較する is文字列のプールはかなり奇妙な規則に従っているため、一般的にしてことは、時には正しく機能しますが、他の場合には機能しないため、かなり邪悪なトラップです。

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


2
@simpleuserもちろんそうです。現実の世界では、文字列の偽造を使用するか、それを空の文字列と比較することは完全に問題ありません。この答えはわざとやりすぎです。
ダッカロン

本当に、eq_を使用しますか?
ボート

素晴らしい仕事をしてくれてありがとう!
eugene.polschikov

14

空または空白の文字列をテストする(短い方法):

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

7
の場合myString = None、例外が発生します。@vaultの回答を
Dominik

9

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


パフォーマンスに何らかの影響を与えない限り、なぜ「」の使用を避けたいのかわかりませんが、混乱が少ないので、何十億もの賛成票を持つ回答を優先してください。しかし、どうやら空のリストもFalseであることを指摘したかったのです。
Brōtsyorfuzthrāx

7

if stringname:与えfalseた文字列が空の場合。これよりも簡単なことはないと思います。


6
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

1
このソリューションで何が得られるか本当に理解できません。問題は、文字列が空かどうかをテストすることです。設定したa='a'場合、は取得されますがa.isspace() -> Falseaそのアカウントでは空の文字列にはなりません。
エイドリアンキースター

6

空の文字列をチェックするために毎回hardcoding(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つの間に懸念分離する必要があります。


1
「」を回避するために、本当に多くの問題に取り組む必要があるのでしょうか。比較の文脈で、空の文字列は他に何を意味する可能性がありますか?

回答を書いているように、CSVは文字列を使用しないとnullを表すことができません。あなたが文脈自由なら、おめでとうございます!ほとんどのコードはそうではありません。
firelynx

2
「not_filled_in」の方が「empty_string」よりもわかりやすいですか?私はあなたが高いと言います。
TuncayGöncüoğlu19年

@TuncayGöncüoğlu "空の文字列"は、ifステートメントがテストする対象を記述していません。
firelynx

5
私はその答えに同意しません。マジックナンバーは悪いです、それは理にかなっています。一般的な魔法の値も同様です。しかし、""同じ魔法値、ではないTrueFalseまたはNone魔法の値ではありません。
ダッカロン

5

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

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

ほとんどの場合、空白を含む文字列は「空」ではありません。
クリスジョンソン

私はあなたが空白だけを意味していると思いますか?あなたは私のstrip()の使用について言及していますか?空のほとんどの目的のために!s.trim()。isEmpty()のようなものを合成することは途方もなく一般的です
BuvinJ

@Chris Johnsonさん、回答のほとんどがstrip()も使用していることをご存知ですか?私たち全員、または私だけの反対票を投じましたか?
BuvinJ 2017年

4

@ 1290に返信。コメントのブロックをフォーマットする方法はありません。None値は、Pythonに空の文字列ではなく、いずれも(スペース)です。Andrew Clarkからの答えは正しいものですif not myString。@roubleからの回答はアプリケーション固有であり、OPの質問には回答しません。「空」の文字列の固有の定義を採用すると、問題が発生します。具体的には、標準的な動作はつまりstr(None)生産します'None'空白以外の文字列ます。

ただし、Noneand(スペース)を「空白」の文字列として扱う必要がある場合は、次の方法が適しています。

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文字列の予想される動作を損なうことなく、@ rouble要件を満たします。


python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Yordan Georgiev

3

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

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

警告、アサートはデバッグツールとして意図されており、-Oフラグを移動したり、PYTHONOPTIMIZEenv変数を設定したりすると最適化されます。
SilentVoid

2

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

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

3
入力が文字列かどうかを確認したい場合は、カルダモンからの回答がより完全です
tanzil

1
not str(myString)

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


0

あなたはPythonでこの空の値または文字列の割り当てを見るかもしれません

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



0

行ごとにファイルを読み込んでいて、どの行が空であるかを判断する場合は.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

使うだけなら

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

これが誰かに役立つ場合は、リストのリストで空の文字列を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データベースにリストのリストを投稿するのに役立ちます。


-1

''、 ''、 '\ n'などの文字列で実験を行いました。変数fooが少なくとも1つの非空白文字を含む文字列である場合にのみ、isNotWhitespaceをTrueにしたいです。Python 3.6を使用しています。これが私が終わったものです:

isWhitespace = str is type(foo) and not foo.strip()
isNotWhitespace = str is type(foo) and not not foo.strip()

必要に応じて、これをメソッド定義でラップします。


-3

上記のprmattaと同じですが、間違いです。

def isNoneOrEmptyOrBlankString (myString):
    if myString:
        if not myString.strip():
            return True
        else:
            return False
    return False

ただ、テスト:彼のコードが戻るための真""" "ためとFalse "a"(同じように期待)。あなたのコードは同じことを返しますが、空の文字列はTrueを返しますが、それはすべきではありません。
AbcAeffchen 2014年

疲れすぎた:コードは空の文字列に対してFalseを返します。
AbcAeffchen 2014年

このコードは間違っています。文字列が空または何もない場合は、Falseを返します。
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.