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


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그들이 비어 있거나없는 경우 부울 맥락에서. 그들은는 동일하지 에 False나 True.


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.