Python의 기능과 같은 sprintf


131

sprintf파이썬에서 C 스타일 기능을 사용하여 텍스트 파일에 버퍼를 작성하고 처리하고 많은 처리를 수행하는 문자열 버퍼를 만들고 싶습니다 . 조건문 때문에 파일에 직접 쓸 수 없습니다.

예 : 의사 코드 :

sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)

따라서 출력 파일에는 다음과 같은 종류의 o / p가 있습니다.

A= foo B= bar
C= ded
etc...

내 질문을 명확히하기 위해 편집 :
buf 큰 버퍼는 sprintf를 사용하여 서식이 지정된 모든 문자열을 포함합니다. 예를 들어, buf이전 값이 아닌 현재 값만 포함합니다. 예를 들어 나중에 buf쓴 첫 번째 내용 은 동일하게 추가 되었지만 Python 답변 에는 마지막 값만 포함되어 있습니다. 필자는 아닙니다 . 처음부터와 같이 시작한 모든 것을 갖고 싶습니다 .A= something ,B= somethingC= somethingbufbufbufprintfC


1
sprintf ()는 C에서 작동하는 방식이 아닙니다. ( buf끝 부분이 아닌 시작 부분에 내용을 씁니다 .) 문자열 배열을 사용하고 파일에 쓰기 전에 함께 결합하는 것이 가장 좋습니다.
yam655

@dividebyzero 파이썬에서 일반적인 프로그래밍 언어이므로 사소하지 않습니까? 예를 들어 Michael J. Barber의 솔루션 (댓글 게시 후)을 참조하십시오. def sprintf(buf, fmt, *args): ...
jdk1.0

@ jdk1.0 의미하는 바를 알지 못하고, 젊고 순진한 파이썬 프로그래머였습니다 ...이 버퍼 재사용이 그렇게 간단하지 않기 때문에이 질문은 실제로 이상합니다. 각각의 sprintf 호출, 그리고 이런 종류의 일은 파이썬을 할 때 걱정해야 할 것이 아닙니다. 어쨌든, 나는 스칼라로 넘어 가서 기쁘다. 이제 줄리아!
splitbyzero

답변:


169

파이썬에는이를위한 %연산자가 있습니다.

>>> a = 5
>>> b = "hello"
>>> buf = "A = %d\n , B = %s\n" % (a, b)
>>> print buf
A = 5
 , B = hello

>>> c = 10
>>> buf = "C = %d\n" % c
>>> print buf
C = 10

지원되는 모든 형식 지정자에 대해서는이 참조 를 참조하십시오 .

당신은뿐만 아니라 사용할 수 있습니다 format:

>>> print "This is the {}th tome of {}".format(5, "knowledge")
This is the 5th tome of knowledge

40

귀하의 질문을 올바르게 이해하면 format ()mini-language 와 함께 찾고 있습니다 .

파이썬 2.7 이상의 어리석은 예 :

>>> print "{} ...\r\n {}!".format("Hello", "world")
Hello ...
 world!

이전 파이썬 버전의 경우 : (2.6.2로 테스트)

>>> print "{0} ...\r\n {1}!".format("Hello", "world")
Hello ...
 world!

4
해당 버전은 Python 3에서만 작동한다는 점에 유의해야합니다. 예를 들어 Python 2.6에서는 다음을 수행해야합니다."{0} ...\r\n {1}!".format("Hello", "world")
Mark Longair

1
그것을 포함하기 위해 내 대답을 편집; 파이썬 2.7에서도 작동하지 않습니다!
니콜라스 레 페브르

20

목표를 이해한다고 확신 할 수는 없지만 StringIO인스턴스를 버퍼로 사용할 수 있습니다 .

>>> import StringIO 
>>> buf = StringIO.StringIO()
>>> buf.write("A = %d, B = %s\n" % (3, "bar"))
>>> buf.write("C=%d\n" % 5)
>>> print(buf.getvalue())
A = 3, B = bar
C=5

와 달리 sprintf문자열을에 전달 buf.write하여 %연산자 나 format문자열 의 메서드로 형식을 지정합니다 .

물론 원하는 sprintf인터페이스 를 얻는 함수를 정의 할 수 있습니다.

def sprintf(buf, fmt, *args):
    buf.write(fmt % args)

다음과 같이 사용됩니다.

>>> buf = StringIO.StringIO()
>>> sprintf(buf, "A = %d, B = %s\n", 3, "foo")
>>> sprintf(buf, "C = %d\n", 5)
>>> print(buf.getvalue())
A = 3, B = foo
C = 5

2
문자열 형식화 연산자 (%)와 함께 * args를 사용하는 방법을 보여주는 +1
커티스 얄롭

io.StringIO()대신 Python3 사용
Wolf


11

문자열 형식을 사용할 수 있습니다.

>>> a=42
>>> b="bar"
>>> "The number is %d and the word is %s" % (a,b)
'The number is 42 and the word is bar'

그러나 이것은 Python 3에서 제거되었으므로 "str.format ()"을 사용해야합니다.

>>> a=42
>>> b="bar"
>>> "The number is {0} and the word is {1}".format(a,b)
'The number is 42 and the word is bar'

4
잘못, 그것은 파이썬 3에서 제거되지 않습니다. 파이썬 3.0은 3.1에서 더 이상 사용되지 않을 것이라고 말했지만 결코 그런 일은 없었습니다. 사용 format()하는 것이 바람직하지만 %형식이 여전히 존재합니다. ( 더 이상 사용되지 않는 이유에 대해서는 mail.python.org/pipermail/python-dev/2009-September/092399.html 참조 )
Duncan

1
@ 던컨; 고마워, 난 몰랐어 더 이상 사용되지 않는 곳을 읽고 다시 시도하지 않았습니다. :).
utdemir

7

매우 긴 문자열에 삽입하려면 올바른 위치에 있기를 바라지 않고 다른 인수에 이름을 사용하는 것이 좋습니다. 또한 여러 반복을 쉽게 교체 할 수 있습니다.

>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'

다른 모든 관련 답변도 표시 되는 형식 예제 에서 가져 왔습니다 Format.


3

이것은 아마도 C 코드에서 Python 코드로 가장 가까운 번역 일 것입니다.

A = 1
B = "hello"
buf = "A = %d\n , B= %s\n" % (A, B)

c = 2
buf += "C=%d\n" % c

f = open('output.txt', 'w')
print >> f, c
f.close()

%Python 의 연산자는 C와 거의 동일합니다 sprintf. 문자열을 파일로 직접 인쇄 할 수도 있습니다. 이러한 문자열 형식의 stringlet이 많이 포함 된 경우 StringIO처리 시간을 단축하기 위해 개체를 사용하는 것이 좋습니다 .

따라서을 수행하는 대신 다음을 수행 +=하십시오.

import cStringIO
buf = cStringIO.StringIO()

...

print >> buf, "A = %d\n , B= %s\n" % (A, B)

...

print >> buf, "C=%d\n" % c

...

print >> f, buf.getvalue()

3

python3 인쇄 기능과 같은 것이지만 문자열을 원한다면 :

def sprint(*args, **kwargs):
    sio = io.StringIO()
    print(*args, **kwargs, file=sio)
    return sio.getvalue()
>>> x = sprint('abc', 10, ['one', 'two'], {'a': 1, 'b': 2}, {1, 2, 3})
>>> x
"abc 10 ['one', 'two'] {'a': 1, 'b': 2} {1, 2, 3}\n"

또는 '\n'끝에 없이 :

def sprint(*args, end='', **kwargs):
    sio = io.StringIO()
    print(*args, **kwargs, end=end, file=sio)
    return sio.getvalue()
>>> x = sprint('abc', 10, ['one', 'two'], {'a': 1, 'b': 2}, {1, 2, 3})
>>> x
"abc 10 ['one', 'two'] {'a': 1, 'b': 2} {1, 2, 3}"

1

뭔가 ...

greetings = 'Hello {name}'.format(name = 'John')

Hello John

이것은 문자열이 아닌 콘솔에 문자열을 인쇄하여 OP가 원하는 것입니다.
Teemu Leisti

또한 화면에 % s이 (가) 인쇄되지 않았습니다. 하지만 쉼표로 여러 변수를 추가 할 수 있다는 것이 좋습니다.
b01


0

두 가지 방법은 문자열 버퍼에 쓰거나 행을 목록에 쓰고 나중에 조인하는 것입니다. 나는 StringIO접근 방식이 더 파이썬 적이 라고 생각 하지만 파이썬 2.6 이전에는 작동하지 않았다.

from io import StringIO

with StringIO() as s:
   print("Hello", file=s)
   print("Goodbye", file=s)
   # And later...
   with open('myfile', 'w') as f:
       f.write(s.getvalue())

ContextMananger( s = StringIO()) 없이 사용할 수도 있습니다 . 현재 print함수 와 함께 컨텍스트 관리자 클래스를 사용하고 있습니다. 이 프래그먼트는 디버깅 또는 홀수 페이징 요구 사항을 삽입하는 데 유용 할 수 있습니다.

class Report:
    ... usual init/enter/exit
    def print(self, *args, **kwargs):
        with StringIO() as s:
            print(*args, **kwargs, file=s)
            out = s.getvalue()
        ... stuff with out

with Report() as r:
   r.print(f"This is {datetime.date.today()}!", 'Yikes!', end=':')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.