2013-08-12 4 views
21

파이썬 2.7.3을 사용하고 있으며 사용자 정의 파일의 16 진수 바이트 값을 인쇄하는 스크립트를 작성하고 있습니다. 한 가지 문제로 올바르게 작동합니다. 각 값이 새 줄에 인쇄됩니다. 새 줄 대신 공백을 사용하여 값을 인쇄 할 수 있습니까?python print() 함수의 새로운 행

예를 들어

, 대신

61

62

나는 61 년 대신 '(62)를 가질 수 있습니까? 다음은

내 코드 ('..txt'텍스트 'ABCD'가 포함 된 파일입니다)입니다 : 모든 print

#!usr/bin/python 
import os 
import sys 
import time 

filename = raw_input("Enter directory of the file you want to convert: ") 

f = open(filename, 'rb') 
fldt = f.read() 
lnfl = len(fldt) 
print "Length of file is", lnfl, "bytes. " 
orck = 0 
while orck < lnfl: 
    bndt = hex(ord(fldt[orck])) 
    bndt = bndt[-2:] 
    orck = orck + 1 
    ent = chr(13) + chr(10) 
    entx = str(ent) 
    bndtx = str(bndt) 
    bndtx.replace(entx, ' ') 
    print bndtx 

답변

35

먼저 파이썬 2의 함수가 아니라, 그것은 문이다 .

자동 줄 바꿈을 억제하려면 후행 , (쉼표)을 추가하십시오. 이제 개행 문자 대신 공백이 사용됩니다.

데모 :

print 1, 
print 2 

출력 :

1 2 

또는 사용 파이썬 3의 print() function :

from __future__ import print_function 
print(1, end=' ') # default value of `end` is '\n' 
print(2) 

명확 print() 기능은 훨씬 더 강력 우리는있는 그대로 볼 수 있듯이 임의의 문자열을 지정할 수 있습니다. o 고정 된 공간 대신 ​​end으로 사용하십시오.

20

이 거의 모든 것을 당신이 원하는 않습니다 이런 식으로 만든 data.txt로와

f = open('data.txt', 'rb') 

while True: 
    char = f.read(1) 
    if not char: break 
    print "{:02x}".format(ord(char)), 

:

f = open('data.txt', 'wb') 
f.write("ab\r\ncd") 
f.close() 

내가 얻을 다음과 같은 출력 :

61 62 0d 0a 63 64 

TL; DR - 1. 변수 이름이 잘못되었습니다. 2. 16 진수 문자열을 잘못 슬라이스하고 있습니다. 3. 코드는 개행을 절대 대체하지 않습니다. 그 기능을 잊고 싶을 수도 있습니다. 문자, 정수 코드 및 정수를 나타내는 16 진수 문자열의 차이를 아직 이해하지 못했습니다. 그것들은 모두 다르다 : 두 개는 문자열이고 다른 하나는 정수이다. 그리고 그들 중 어느 것도 서로 동일하지 않다. 4. 일부 파일의 경우 줄 바꿈을 제거하지 않아야합니다.

===

1. 변수 이름은 끔찍한입니다.

아무에게도 질문하지 않으려면 괜찮습니다. 그러나 모든 사람이 질문을해야하기 때문에 누구나 이해할 수있는 설명적인 변수 이름을 사용해야합니다.변수 이름은 다음보다 약간 낫습니다.

fname = 'data.txt' 
f = open(fname, 'rb') 
xxxyxx = f.read() 

xxyxxx = len(xxxyxx) 
print "Length of file is", xxyxxx, "bytes. " 
yxxxxx = 0 

while yxxxxx < xxyxxx: 
    xyxxxx = hex(ord(xxxyxx[yxxxxx])) 
    xyxxxx = xyxxxx[-2:] 
    yxxxxx = yxxxxx + 1 
    xxxxxy = chr(13) + chr(10) 
    xxxxyx = str(xxxxxy) 
    xyxxxxx = str(xyxxxx) 
    xyxxxxx.replace(xxxxyx, ' ') 
    print xyxxxxx 

이 프로그램은 정상적으로 실행되지만 이해하기는 어렵습니다.

2. hex() 함수는 길이가 다른 문자열을 생성합니다.

예를 들어

,

print hex(61) 
print hex(15) 

--output:-- 
0x3d 
0xf 

그리고 슬라이스 [-2 :]를 복용 :

3d 
xf 

두 번째에있는 'x'를 얻었는지를 참조하는 문자열의 각각에 대해 당신에게 제공 하나? 슬라이스 :

[-2:] 

문자열의 끝으로 이동하여 두 개의 문자를 백업 한 다음 나머지 문자열을 가져온다고 말합니다. 대신 그 일의 처음부터 3 개 문자를 시작하는 슬라이스를 가지고 :

[2:] 

3. 코드는 줄 바꿈을 대체하지 않습니다.

파일을 가정이 두 연속 된 문자가 있습니다

"\r\n" 

이제, 첫 번째 문자에서 읽기 "\ 연구", 및 정수, ORD ("\ r에")로 변환, 제공 당신은 정수 13. 지금 당신은 변환 당신에게 문자열 "0xd"를 제공하고, 당신이 당신에게주는 처음 두 문자를 슬라이스 문자열, 진수 (13)에 : 코드에서

"d" 

다음이 줄을 :

bndtx.replace(entx, ' ') 

문자열 에있는 모든 문자열 "\r\n"을 찾아 바꾸십시오. 대체 문자열은 2 자이고 문자열은 "d"은 1 자 길이이므로 대체 할 수 없습니다.

교환은 "\r\n""0d" 중 하나에서 작동하지 않습니다. 그러나 적어도 두 문자열에는 두 문자가 있기 때문에 작동 할 가능성이 있습니다. 두 문자열을 공통 분모 인 ascii 코드로 축소합시다. "\ r"의 ASCII 코드는 13이고 "\ n"의 ASCII 코드는 10입니다. 이제 "0d" 문자열은 무엇입니까? 문자"0"의 ASCII 코드는 48이며 문자 "d"의 ASCII 코드는 100입니다. 이러한 문자열에는 공통 문자가 하나도 없습니다. 심지어이 작동하지 않습니다

x = '0d' + '0a' 
x.replace("\r\n", " ") 
print x 

--output:-- 
'0d0a' 

을하지도 않습니다이 :

x = 'd' + 'a' 
x.replace("\r\n", " ") 
print x 

--output:-- 
da 

결론입니다 : 헥스 문자열에 다음 정수로 문자를 변환하는 당신에게 원래 문자를주고 결국하지 않습니다 - 그들은 다른 문자열입니다.따라서 이렇게하면 :

char = "a" 
code = ord(char) 
hex_str = hex(code) 

print char.replace(hex_str, " ") 

... "a"는 공백으로 바꿀 수 없습니다. 여기에 출력을 살펴보면 :

char = "a" 
print repr(char) 

code = ord(char) 
print repr(code) 

hex_str = hex(code) 
print repr(hex_str) 

print repr(
    char.replace(hex_str, " ") 
) 

--output:-- 
'a' 
97 
'0x61' 
'a' 

당신 '이'는 거기에 한 문자와 문자열 것을 볼 수 있으며, '0x61' 4 개 거기에 문자가있는 문자열입니다 '0', 'x', '6''1', 그리고 당신은 하나의 문자열 안에 4 개의 문자열을 찾을 수 없다.

4) 줄 바꿈을 제거하면 데이터가 손상 될 수 있습니다.

일부 파일의 경우 줄 바꿈을 바꾸지 않으려합니다. 예를 들어 이미지의 색상을 나타내는 정수가 들어있는 파일 인 .jpg 파일을 읽었을 때 이미지의 일부 색상이 번호 13으로 표시되고 숫자 10이 표시되면 코드는 출력에서 ​​해당 색상을 제거합니다.

그러나 텍스트 개의 파일 만 읽는 프로그램을 작성하는 경우 줄 바꾸기가 좋습니다. 그러나 다른 운영 체제에서는 다른 줄 바꿈을 사용합니다. Windows 줄 바꿈 (\ r \ n)을 바꾸려고합니다. 즉, 줄 바꿈에 \ n을 사용하는 Mac 또는 Linux 컴퓨터에서 만든 파일에서 프로그램이 작동하지 않습니다. 쉽게 해결할 수있는 방법이 있지만 어쨌든 걱정하지 않으려 고합니다.

나는 그 모든 것이 너무 혼란스럽지 않기를 바랍니다.