2013-08-12 21 views
21

私はPython 2.7.3を使用しています。ユーザ定義ファイルの16進バイト値を出力するスクリプトを作成しています。 1つの問題で正しく動作しています。それぞれの値が新しい行に出力されています。新しい行ではなくスペースで値を印刷することは可能ですか?python print()関数の新しい行

たとえば、代わりに

の私が代わりに'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

まずPythonの2の関数ではありません、それは文です。

自動改行を抑制するには、末尾に,(カンマ)を追加します。これで、改行の代わりにスペースが使用されます。

デモ:

print 1, 
print 2 

出力:

1 2 

または使用のPython 3のprint() function

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

あなたがはっきりprint()機能ははるかに強力な我々としてで見ることができるように任意の文字列tを指定できます固定されたスペースではなく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進文字列の違いはまだ分かりません。それらはすべて異なります.2つは文字列、もう1つは整数であり、どれも互いに等しいわけではありません。 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' を得た方法を参照してください。 1?スライス:

[-2:] 

は、文字列の最後に移動して2文字をバックアップし、残りの文字列を取得すると言います。代わりにそれを行うの、最初から3つの文字を開始スライスを取る:

[2:] 

3.あなたのコードは、任意の改行を置き換えることはありません。

は、あなたのファイルは、これら2つの連続した文字を持っているとします

"\r\n" 

今、あなたは最初の文字、「\ R」で読み、整数に変換し、ORD(「\ rを」)、を与えますあなたの整数13.今、あなたはあなたの文字列"0xd"を与える文字列、進(13)、にあることを変換し、あなたはあなたを与える最初の2つの文字を切り取る:

"d" 

次に、あなたのコードでは、この行:

bndtx.replace(entx, ' ') 

文字列にある文字列"\r\n"がすべて見つかると、置き換えられます。置換文字列が2文字で、文字列が"d"の場合は1文字の長さなので、置き換えられることはありません。

交換は"\r\n""0d"のいずれでも機能しません。しかし、少なくとも2つの文字列には2文字が含まれている可能性があります。両方の文字列を共通の分母、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 

は、一番下の行がある:16進文字列に、整数に文字を変換することはあなたのオリジナルキャラクターを与えてまで終わりません彼らはちょうど異なる文字列です。したがって、あなたがこれを行う場合:

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

print char.replace(hex_str, " ") 

... "a"はスペースで置き換えることはできません。あなたがここに出力を調べると:、'0''x''6'、および'1'

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' 

あなたは「」その中の1文字の文字列で、'0x61'はそれで4文字の文字列であることがわかります1つの文字列の中に4文字の文字列を見つけることはできません。

4)改行を削除すると、データが破損する可能性があります。

ファイルによっては、改行を置き換えたくないファイルもあります。たとえば、イメージ内の色を表す一連の整数を含むファイルで、イメージ内のいくつかの色が番号13で表され、その後に番号10が付いたファイルである.jpgファイルを読み込んでいる場合、コードは出力からこれらの色を削除します。

ただし、のテキストファイルのみを読み込むプログラムを作成する場合は、改行を置き換えると問題はありません。しかし、異なるオペレーティングシステムでは異なる改行が使用されます。 Windowsの改行(\ r \ n)を置き換えようとしています。これは、改行のために\ nを使用するMacまたはLinuxコンピュータで作成されたファイルでプログラムが機能しないことを意味します。それを解決する簡単な方法がありますが、それについては心配したくないかもしれません。

私はすべてがそれほど混乱しないことを願っています。

関連する問題