etc./StackOverFlow

문자열이 비어 있는지 확인하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2022. 1. 5. 09:43
반응형

질문자 :Joan Venge


Python에는 다음을 수행할 수 있는 빈 문자열 변수와 같은 것이 있습니까?

 if myString == string.empty:

그럼에도 불구하고 빈 문자열 값을 확인하는 가장 우아한 방법은 무엇입니까? 빈 문자열을 검사할 때마다 하드 코딩 ""



빈 문자열은 "falsy"( python 2 또는 python 3 참조)입니다. 즉, 부울 컨텍스트에서 false로 간주되므로 다음과 같이 하면 됩니다.

 if not myString:

변수가 문자열이라는 것을 알고 있는 경우 선호되는 방법입니다. 변수가 다른 유형일 수도 있다면 myString == "" 를 사용해야 합니다. 부울 컨텍스트에서 거짓인 다른 값 에 대해서는 진실 값 테스트에 대한 문서를 참조하십시오.


Andrew Clark

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

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

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

 if not some_string:

또는:

 if some_string:

명확히하기 위해 시퀀스는 비어 있는지 여부에 관계없이 부울 컨텍스트에서 False 또는 True 로 평가 됩니다. False 또는 True 같지 않습니다 .


zenpoy

가장 우아한 방법은 아마도 참인지 거짓인지 간단히 확인하는 것입니다. 예:

 if not my_string:

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

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

그러나 이 문자열이 일종의 유효성 검사를 통과했으며 이러한 방식으로 테스트할 수 있는 문자열이라는 것을 확실히 알지 못하는 경우에는 이 부분에서 좀 더 명시적이어야 합니다.


Bartek

나는 벗기기 전에 무의미함을 시험할 것이다. 또한 빈 문자열이 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())

rouble

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

 def is_not_blank(s): return bool(s and not s.isspace())

시험:

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

vault

이를 수행하는 유일한 확실한 방법은 다음과 같습니다.

 if "".__eq__(myString):

다른 모든 솔루션에는 검사가 실패할 수 있는 가능한 문제와 극단적인 경우가 있습니다.

len(myString)==0 myString str __len__() 메서드를 재정의하는 클래스의 객체인 경우 실패할 수 있습니다.

유사하게 myString == ""myString.__eq__("") myString __eq__()__ne__() 재정의하는 경우 실패할 수 있습니다.

어떤 이유로 "" == myString myString __eq__() 재정의하는 경우에도 속게 됩니다.

myString is "" 이고 "" is myString 입니다. myString 이 실제로 문자열이 아니라 문자열의 하위 클래스인 경우 둘 다 실패 False 를 반환함). 또한, 그것들이 신원 확인이기 때문에 그들이 작동하는 유일한 이유는 파이썬이 인턴인 경우 동일한 문자열 인스턴스를 사용하는 문자열 풀링(String Internment라고도 함)을 사용하기 때문입니다(여기 참조: 왜 '=를 사용하여 문자열을 비교합니까? =' 또는 'is'가 때때로 다른 결과를 생성합니까? ). 그리고 "" 는 CPython에서 처음부터 인턴

신원 확인의 가장 큰 문제는 String Internment가 (내가 찾을 수 있는 한) 어떤 문자열이 수용되는지 표준화되어 있지 않다는 것입니다. 즉, 이론적으로 "" 인턴이 필요하지 않으며 구현에 따라 다릅니다.

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

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

이것은 이론적인 작업일 뿐만 아니라 실제로 실제 사용과 관련이 있을 수 있습니다. 이전에 str myString is "" 사용하면 ""이 잘못된 출력을 반환할 수 있기 때문입니다.

또한, 사용하여 문자열을 비교하는 is 문자열 풀링 꽤 이상한 규칙을 따르기 때문에 일반적으로는, 제대로 가끔 작동하기 때문에 매우 사악한 함정이 있지만 다른 시간에.

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


Dakkaron

빈 문자열 또는 빈 문자열 테스트(짧은 방법):

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

prrvchr

빈 문자열과 null 문자열을 구별하려면 if len(string) 사용하는 것이 좋습니다. 그렇지 않으면 다른 사람들이 말한 대로 if string 을 사용하는 것이 좋습니다. 공백으로 가득 찬 문자열에 대한 주의 사항은 여전히 적용되므로 strip 하는 것을 잊지 마십시오.


Silas Ray

if stringname: 문자열이 비어 있으면 false 제공합니다. 이보다 간단할 수는 없는 것 같아요.


Kakashi

빈 문자열을 검사할 때마다 하드코딩(원문 그대로) ""이 좋지 않습니다.

깔끔한 코드 접근

이렇게 하면: 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 이어야 함)과 코드 구현(실제로 비교 대상)을 혼합하기 때문입니다.

둘 사이 에 관심 의 분리가 필요합니다.


firelynx

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

Roman Semirook

이것은 어떤가요? 아마도 "가장 우아한" 것은 아니지만 꽤 완전하고 명확해 보입니다.

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

BuvinJ

@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 요구 사항을 충족합니다.


Chris Johnson

'', ' ', '\n' 등과 같은 문자열로 몇 가지 실험을 했습니다. foo 변수가 공백이 아닌 문자가 하나 이상 있는 문자열인 경우에만 isNotWhitespace가 True가 되기를 바랍니다. 저는 파이썬 3.6을 사용하고 있습니다. 내가 끝내는 것은 다음과 같습니다.

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

원하는 경우 이를 메서드 정의에 래핑합니다.


Tom Stambaugh

not str(myString)

이 표현식은 비어 있는 문자열에 대해 True입니다. 비어 있지 않은 문자열, None 및 문자열이 아닌 객체는 모두 False를 생성하며 객체가 __str__을 재정의하여 거짓 값을 반환하여 이 논리를 방해할 수 있다는 경고와 함께.


Fax

파일을 줄 단위로 읽을 때 어떤 줄이 비어 있는지 확인하려면 "빈" 줄에 새 줄 문자 .strip()

 lines = open("my_file.log", "r").readlines() for line in lines: if not line.strip(): continue # your code for non-empty lines

Pavel Štěrba

Python에서 빈 값 또는 문자열 할당하기를 참조 할 수 있습니다.

이것은 비어 있는 문자열을 비교하는 것입니다. not 으로 공백을 테스트하는 대신 "" 빈 문자열이 있는 빈 문자열과 같은지 테스트할 수 있습니다.


kiriloff

Apache StringUtils.isBlank 또는 Guava Strings.isNullOrEmpty 와 같은 동작을 기대하는 사람들을 위해:

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

kommradHomer

그냥 사용한다면

 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

jberrio

이것이 누군가에게 유용한 경우를 위해 목록 목록(python 2)에서 빈 문자열을 N/A로 교체하기 위해 만든 빠른 기능이 있습니다.

 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 데이터베이스에 목록 목록을 게시하는 데 유용합니다. 제 경우에는 복합 기본 키 때문이었습니다.


FlyingZebra1

prmatta가 위에 게시했지만 실수가 있습니다.

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

Shadow

출처 : http:www.stackoverflow.com/questions/9573244/how-to-check-if-the-string-is-empty

반응형