문자열이 비어 있는지 확인하는 방법?


1416

파이썬에는 빈 문자열 변수와 같은 것이 있습니까?

if myString == string.empty:

그럼에도 불구하고 빈 문자열 값을 확인하는 가장 우아한 방법은 무엇입니까? ""빈 문자열을 확인하기 위해 매번 하드 코딩 을하는 것이 좋지 않습니다.


2
얼마나 ""좋지 않습니까?
NONAME

답변:


2114

빈 문자열은 "거짓"입니다. 이는 부울 컨텍스트에서 거짓으로 간주되므로 다음과 같이하면됩니다.

if not myString:

변수가 문자열임을 알고있는 경우이 방법이 선호됩니다. 변수가 다른 유형일 수도있는 경우을 사용해야합니다 myString == "". 부울 컨텍스트에서 잘못된 다른 값 에 대해서는 진실 값 테스트 문서를 참조하십시오 .


183
다른 많은 것들도 거짓이기 때문에 조심하십시오.
Ignacio Vazquez-Abrams

9
나는 전에 거짓이라는 용어를 들어 본 적이 없다. 그것이 거짓을 반환한다는 의미입니까?
Joan Venge

41
@Joan : 부울 컨텍스트에서 false로 평가됩니다.
Ignacio Vazquez-Abrams

54
영업 이익은 변수가 빈 문자열이 있는지 알고 싶어하지만, 당신은 또한 입력 할 if not myString:경우 블록을 myString했다 None, 0, False등 그래서 당신은 확실히 타입이 무엇을하지 않은 경우 myString, 당신은 사용해야 if myString == "":은 반대로 빈 문자열이 있는지 확인하려면 다른 허위 가치.
Andrew Clark

15
이러한 경우 @AndrewClark는 일련의 if myString == ...표현 대신 if myString in (None, '')@Bartek을 사용 하거나 그에 따라 사용할 수 있습니다 .if myString in (None, '') or not myString.strip()
Stew

412

에서 PEP 8 의에서 "권장 사항 프로그래밍"섹션 :

시퀀스 (문자열, 목록, 튜플)의 경우 빈 시퀀스가 ​​거짓이라는 사실을 사용하십시오.

따라서 다음을 사용해야합니다.

if not some_string:

또는:

if some_string:

그냥 순서가되어, 명확하게 평가False또는 True그들이 비어 있거나없는 경우 부울 맥락에서. 그들은는 동일하지FalseTrue.


24
PEP에 대한 참조를 포함 시켰습니다.
Felix

3
추신 : PEP의 방어에서“ x는 거짓 ”(소문자는 거짓 )이라는 말은 이미 의미가 아니라 그것을 의미 한다고 주장 할 수 x == False있습니다. 그러나 IMHO는 대상 청중에게 설명을 환영합니다.
MestreLion

233

가장 우아한 방법은 다음과 같이 참인지 거짓인지 간단히 확인하는 것입니다.

if not my_string:

그러나 다음과 같은 이유로 공백을 제거 할 수 있습니다.

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

그러나이 문자열이 어떤 종류의 유효성 검사를 통과했으며이 방법으로 테스트 할 수있는 문자열인지 확실하지 않은 경우에는이 부분에서 좀 더 명확해야합니다.


87

벗기기 전에 테스트를하지 않을 것입니다. 또한 빈 문자열이 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 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())

왜 안돼 if mystring and not mystring.strip()?
Migol

1
어떻게 다른 string and not string.isspace()가요?
Andrea Corbellini

7
그런 것들에 관심이있는 사람들에게는 더 간결합니다 : def isBlank(s): return not (s and s.strip())그리고 def isNotBlank(s): return s and s.strip().
Carl

48

나는 한 번 Bartek의 답변과 비슷한 것을 썼고 자바 스크립트에서 영감을 얻었습니다.

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). 또한 ID 확인이기 때문에 파이썬이 작동하는 유일한 이유는 파이썬이 문자열 풀링 (문자열 인턴이라고도 함)을 사용하여 문자열의 동일한 인스턴스를 사용하는 것입니다 (여기 : '= = '또는'is '는 때때로 다른 결과를 생성합니까? ). 그리고 ""CPython의 시작부터 인턴

신원 확인의 큰 문제는 문자열 인턴이 어떤 문자열이 인턴되어 있는지 표준화되어 있지 않다는 것입니다. 즉, 이론적으로 ""는 필요하지 않으며 구현에 따라 다릅니다.

실제로 속일 수없는 유일한 방법은 처음에 언급 한 방법입니다 "".__eq__(myString). 이것은 명시 적으로 __eq__()빈 문자열 의 메소드를 호출하기 때문에 myString의 메소드를 대체하여 속일 수 없으며의 하위 클래스와 제대로 작동합니다 str.

또한 객체가 __bool__()메서드를 재정의하면 문자열의 거짓에 의존하는 것이 작동하지 않을 수 있습니다 .

이것은 이론적 인 작업 일뿐 만 아니라 실제로 프레임 워크 및 라이브러리 서브 클래스 화 str를 사용하고 사용하여 myString is ""잘못된 출력을 반환 할 수 있기 때문에 실제 사용과 관련이 있을 수 있습니다.

또한 is문자열 풀링이 꽤 이상한 규칙을 따르기 때문에 때로는 올바르게 작동하지만 다른 시간에는 그렇지 않기 때문에 일반적으로 문자열을 사용 하는 것은 꽤 나쁜 함정입니다.

즉, 대부분의 경우 언급 된 모든 솔루션이 올바르게 작동합니다. 이 게시물은 대부분 학업입니다.


2
@simpleuser 물론입니다. 실제로는 문자열의 위조를 사용하거나 빈 문자열과 비교하는 것이 좋습니다. 이 답변은 의도적으로 과잉입니다.
Dakkaron

정말 eq_를 사용 하시겠습니까 ?
slboat

대단한 일, 감사합니다!
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.


""를 사용하여 성능에 영향을 미치지 않는 한 왜 ""를 사용하지 않으려는지 모르겠지만 혼란스럽지 않기 때문에 수십억 개의 공감대가있는 답변을 선호합니다. 그러나 빈 목록도 거짓이라고 지적하고 싶었습니다.
Brōtsyorfuzthrāx

7

if stringname:false문자열이 비어있을 때를 제공합니다 . 나는 이것보다 간단 할 수 없다고 생각한다.


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

1
이 솔루션의 이점을 실제로 이해하지 못합니다. 문제는 문자열이 비어 있는지 테스트하는 것입니다. 설정 a='a'하면 얻을 수 a.isspace() -> False있지만 a해당 계정에는 빈 문자열이 아닙니다.
Adrian Keister

6

빈 문자열을 확인하기 위해 매번 하드 코딩 (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)과 코드 구현 (실제 비교 대상)을 혼합하기 때문입니다.

둘 사이 에 우려분리 되어야합니다 .


1
""를 피하기 위해 그렇게 많은 문제를 해결해야합니까? 비교의 맥락에서 빈 문자열은 무엇을 의미 할 수 있습니까?

내 답변에 쓸 때 CSV는 문자열을 사용하지 않으면 null을 나타낼 수 없습니다. 컨텍스트가없는 경우 축하합니다! 대부분의 코드는 그렇지 않습니다.
firelynx

2
"not_filled_in"이 "empty_string"보다 설명 적이라고 말합니까? 나는 당신이 높다고 말합니다.
Tuncay Göncüoğlu

@ TuncayGöncüoğlu "빈 문자열"은 if 문이 무엇을 테스트하는지 설명하지 않습니다.
firelynx

5
나는 그 대답에 동의하지 않을 것입니다. 매직 넘버는 나쁘다. 일반적으로 마법의 가치. 그러나 ""같은 마법의 값이 아닌 True, False또는 None마법 값이 아니다.
Dakkaron

5

이건 어때요? 아마도 "가장 우아하다"는 아니지만 꽤 완벽하고 분명해 보입니다.

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

대부분의 경우 공백이 포함 된 문자열은 "비어 있지 않습니다".
Chris Johnson

나는 당신이 공백만을 의미한다고 생각합니까? strip () 사용을 언급하고 있습니까? 대부분의 경우 비어 있습니다! s.trim (). isEmpty ()와 같은 것을 합성하는 것은 말도 안되는 일입니다.
BuvinJ

안녕하세요 @Chris Johnson, 여기서 대부분의 답변이 strip ()을 사용하는 것을 보셨습니까? 우리 모두에게 투표 했습니까, 아니면 나만 투표 했습니까?
BuvinJ

4

@ 1290에 응답합니다. 주석에서 블록의 형식을 지정할 방법이 없습니다. None값은 파이썬에서 빈 문자열이 아닌, 어느 쪽도 아니는 (공간)입니다. Andrew Clark의 답변은 맞습니다 if not myString. @rouble의 답변은 응용 프로그램에 따라 다르며 OP의 질문에는 대답하지 않습니다. "공백"문자열에 대한 고유 한 정의를 채택하면 문제가 발생할 수 있습니다. 특히 표준 동작은 공백이 아닌 문자열 을 str(None)생성 'None'하는 것입니다.

그러나 None및 (공백)을 "공백"문자열로 취급해야하는 경우 더 나은 방법은 다음과 같습니다.

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
입력이 문자열인지 아닌지를 확인하려면 cardamom의 답변이 더 완벽합니다
tanzil

1
not str(myString)

이 표현식은 비어있는 문자열에 대해 True입니다. 비어 있지 않은 문자열, 없음 및 문자열이 아닌 개체는 모두 False를 생성하며, 잘못된 값을 반환하여 __str__을 재정 의하여이 논리를 방해 할 수 있다는 경고가 있습니다.




0

파일을 한 줄씩 읽을 때 어떤 줄이 비어 있는지 확인하려면 .strip()"빈"줄에 줄 바꿈 문자 가 있으므로를 사용해야 합니다.

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로 목록 목록 (파이썬 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가 공백이 아닌 문자가 하나 이상인 문자열 인 경우에만 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

그냥 테스트 : 그의 코드 반환에 대한 진정한 """ "과 거짓 "a"(다만 예상). 빈 문자열이 True를 반환하지 않아야하는 것을 제외하고는 코드가 동일하게 반환됩니다.
AbcAeffchen 1

너무 피곤하다 : 코드는 빈 문자열에 대해 False를 반환합니다.
AbcAeffchen의

이 코드는 잘못되었습니다. 문자열이 비어 있거나없는 경우 False를 반환합니다.
루블
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.